直接赋值:其实就是对象的引用。
浅拷贝(copy):拷贝父对象,不会拷贝对象内部的子对象。
深拷贝(deepcopy):copy模块的deepcopy方法,完全拷贝了父对象及其子对象。
字典浅拷贝:
a = {'a':[1,2,3]}
b = a.copy()
print(a,b)
结果:{'a': [1, 2, 3]} {'a': [1, 2, 3]}
a['a'].append(4)
print(a,b)
结果:{'a': [1, 2, 3, 4]} {'a': [1, 2, 3, 4]}
深度拷贝,需要引入copy模块:
import copy
a = {'a':[1,2,3]}
c = copy.deepcopy(a)
print(a,c)
结果:{'a': [1, 2, 3]} {'a': [1, 2, 3]}
a['a'].append(4)
print(a,c)
结果:{'a': [1, 2, 3, 4]} {'a': [1, 2, 3]}
解析:
1.b = a,赋值引用,a,b完全指向一个对象。
3.b = copy.deepcopy(a):深度拷贝,完全拷贝了父对象及其子对象,两者是完全独立的。
关于列表的几种拷贝比较:
import copy
a = [0,[1,2,3]]
b = a
c = a[:]
d = list(a)
e = a.copy()
f = copy.deepcopy(a)
a[1].append(4)
a[0] = 9
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
print('e=',e)
print('f=',f)
结果: a= [9, [1, 2, 3, 4]]
b= [9, [1, 2, 3, 4]]
c= [0, [1, 2, 3, 4]]
d= [0, [1, 2, 3, 4]]
e= [0, [1, 2, 3, 4]]
f= [0, [1, 2, 3]]
说明c,d两种赋值方式等同于浅拷贝。 参考:点击打开链接