2. copy.deepcopy() 深拷贝 拷贝对象及其子对象
由于在python中对象之间赋值只是引用的传递,即多个对象指向同一个地址,如
a=[1,2,3]
b=a
此时a与b是指向同一个内存地址的,即存储[1,2,3]的内存地址;
那么如果对b进行改动,则势必会将a的值一并修改,那么此时就必须使用复制来copy一个新的对象,如
a=[1,2,3]
b=copy.copy(a)或者b=copy.deepcopy(a),此时,a与b指向的是不同的内存地址,修改b不会影响到a.
然而深复制和浅复制有什么区别呢?
如果仅仅是一级列表深复制和浅复制并无区别,然后对于list的嵌套则不同,如下:
a=[1,2,3,4,['a','b','c'],5]对于这样一个序列,使用深拷贝和浅拷贝来分别验证;
b=copy.copy(a)
c=copy.deepcopy(a)
结果为:
b=[1,2,3,4,[a,b,c],5]
c=[1,2,3,4,[a,b,c],5]
看起来好像并没有不同,然而我们修改a[4]的内容如使用a[4].append('d'),同时修改a的内容如使用a.append(6)
此时结果为:
a=[1,2,3,4,['a','b','c','d'],5,6]
b=[1,2,3,4,['a','b','c','d'],5]
c=[1,2,3,4,['a','b','c'],5]
可以看出来b,c对于a.append(6)这个操作不感冒,因为它们指向的地址不同,故不会影响;
然而a[4].append('d')则会影响到b,而不会影响到c;
1.原因在于深拷贝会将对象的父对象和子对象一起拷贝,是完整的拷贝;
2.而浅拷贝只是拷贝了父对象,对于子对象,b[4]和a[4]依然指向同一个地址,是引用,而非拷贝,故会被影响;