python浅谈浅拷贝与深拷贝

浅拷贝

    1.=浅拷贝

        =浅拷贝相当于引用,直接进行赋值,原对象改变,则被赋值的对象也会有相同的改变。

a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
b = a
print(a)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
print(b)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
a.append(5)  
print(id(a))  # 2899538518152 
print(id(b))  # 2899538518152

        当然这个id值是会变化的,你每次运行程序,可能id都会变化

    2.copy浅拷贝

        使用copy模块中的copy函数进行浅拷贝,对原对象进行复制,整体使用的是新的对象地址,但是其内部子对象,使用的还是原对象中的子对象的地址,并且,如果该子对象是个不可变对象,例如:元组、数值和字符串,在对该子对象修改后,浅拷贝的中的子对象不会发生改变,但是如果该子对象是个可变对象,例如:列表,字典和集合,则会在子对象修改后,发生改变。

a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
b = copy.copy(a)
a.append(5)
a[4].append("c")
print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2'), 5]
print(b)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2')]
a[6] = ("1","2","3")
print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2', '3'), 5]
print(b)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2')]
print(id(a))  # 2326873163144
print(id(b))  # 2326873162440

深拷贝

        深拷贝则更加严格,则是完全进行拷贝,重新创建了一个对象,并且复制了原对象的值。对原对象进行修改,也不会影响到新对象。

a = [1, 2, 3, 4, ['a', 'b'], {"one": "1", "two": "2"}, ("1","2")]
c = copy.deepcopy(a)
a.append(5)
a[4].append("c")
print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2'), 5]
print(c)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
a[6] = ("1","2","3")
print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], {'one': '1', 'two': '2'}, ('1', '2', '3'), 5]
print(c)  # [1, 2, 3, 4, ['a', 'b'], {'one': '1', 'two': '2'}, ('1', '2')]
print(id(a))  # 2326873163144
print(id(c))  # 2326873165704


总结:

  • 如果只是想使用相同的值,但是不需要考虑原对象是否收到新对象修改的影响时,可以选择直接使用等号来进行浅拷贝。
  • 如果想对新对象修改的同时不影响原对象,并且原对象中无可变子对象,则可以使用copy模块中的copy方法。
  • 如果原对象中有可变子对象,又想进行第二部的操作,可以直接使用copy模块中的deepcopy方法。




原文地址:https://www.cnblogs.com/GF66/p/9785480.html