感觉对深拷贝浅拷贝有一点混淆。特地写了几行,方便自己查看一下他们的区别
import copy
if __name__ == "__main__":
str = "\nn={0}\taddr:{4}\na={1}\taddr:{5}\nb={2}\taddr:{6}\nc={3}\taddr:{7}\n"
# 基数
n = [100,101,[200,201]]
# 直接相等赋值
a = n
# copy拷贝
b = copy.copy(n)
# deepcopy 拷贝
c = copy.deepcopy(n)
# 输出查看变化
print("修改n前变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))
# n追加后变化
n.append(301)
print("n追加后变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))
# n子节点追加后变化
n[2].append(11)
print("n子节点追加后变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))
# 改变n子节点内容后变化
n[2] = [1111,1112]
print("改变n子节点内容后变化:" + str.format(n,a,b,c,id(n),id(a),id(b),id(c)))
下面是运行结果:
从结果可以看出
当直接赋值时,a和n的地址是一样的。而不管深拷贝和浅拷贝地址都是变化的。也就是说,列表n内数据改变时,列表a内的数据也会一起变化。而b,c不会。
当使用浅拷贝时,列表n内的子列表内数据变化时,b列表内的子列表也是一同变化的。也就是说,当使用浅拷贝时,拷贝深度仅为一个对象,而对象内的子对象的地址并不会改变。
当使用深拷贝时,列表c与列表n以及其内的子对象的变化互不影响。也可以理解为两个完全不相干的两个对象。