Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。
什么是id?一个对象的id值在CPython解释器里就代表它在内存中的`地址
import copy
a = [11,22,33,44]
b = a
print(id(a))
print(id(b))
print(id(a) == id(b))
b[1] = 8888
print(a,b)
#输出
4558214960
4558214960
True
[11, 8888, 33, 44] [11, 8888, 33, 44]
当使用浅拷贝时,python只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。看代码:
import copy
a = [11,22,33,44]
c = copy.copy(a)
print(id(a))
print(id(c))
print(id(a) == id(c))
print('\n')
c[1] = 8888
print(a)
print(c)
print(id(a))
print(id(c))
print(id(a) == id(c))
#输出
4559192784
4559193024
False
[11, 22, 33, 44]
[11, 8888, 33, 44]
4559192784
4559193024
False
deepcopy对外围和内部元素都进行了拷贝对象本身,而不是对象的引用。
import copy
a = [[11,22],[33,44]]
d = copy.copy(a)
print(id(a))
print(id(d))
print(id(a) == id(d))
a[1][1] = 8888
print(a)
print(d)
print('\n')
e = copy.deepcopy(a) #因为时深拷贝,这时e中内部元素的值不会因为a中的值改变而改变
a[1][0] = 9999
print(a)
print(e)
print(id(a))
print(id(e))
print(id(a) == id(e))
#输出
4559792160
4559791920
False
[[11, 22], [33, 8888]]
[[11, 22], [33, 8888]]
[[11, 22], [9999, 8888]]
[[11, 22], [33, 8888]]
4559792160
4556920224
False