import copy a = [1, 2, 3, [4, 5]] b = a 赋值,传对象引用 c = copy.copy(a) 浅拷贝 d = copy.deepcopy(a) 深拷贝 a.append(6) a[3].append(7) print("a的值为%s" % (a)) print("b的值为%s" % (b)) print("c的值为%s" % (c)) print("d的值为%s" % (d))
输出的结果为
a的值为[1, 2, 3, [4, 5, 7], 6]
b的值为[1, 2, 3, [4, 5, 7], 6]
c的值为[1, 2, 3, [4, 5, 7]]
d的值为[1, 2, 3, [4, 5]]结果:我们发现a和b的值改变了,d的值没有改变,c的值其中的子对象改变了
结论:Python中赋值实上是新创建了对象的引用,不会新创建一个对象,他们都指向的是同一个内存地址所以当其中的任一方值改变时就会影响另一方,浅拷贝只拷贝对象的第一层数据其他的依旧是原对象的引用,深拷贝拷贝了整个对象的数据
也可以理解为
copy仅拷贝对象本身,而不对其中的子对象进行拷贝,故对子对象进行修改也会随着修改,修改对象本身不会改变。
deepcopy是真正意义上的复制,即从新开辟一片空间。我们经常说的复制实际上就是deepcopy.