python深复制与浅复制区别

1. copy.copy() 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。

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]依然指向同一个地址,是引用,而非拷贝,故会被影响;





你可能感兴趣的:(python)