在python中当定义完或者对一个变量完成赋值以后,在内存中就开辟了一块空间来存储对象。如果要将该对象复制一份给另一个对象就要用到copy模块。
在python中copy包含2个函数:
1. 浅拷贝 copy()
2.深拷贝 deepcopy()
两则的区别主要是: 完成 copy 后对象的内存地址会不一样,但这个不一样也仅是对变长的数据类型而言,对于定长的数据类型两则是一样的,都是对同一个对象的地址引用,指向内存中的同一个地址,所以对于定长的数据类型来说两个函数是完全一样的。
变长数据类型:列表(list)、字典(dict)、集合(set)
定长数据类型:元组(tuple)、字符串(str)、整型(int)、浮点型(float)
浅拷贝(Shallow Copies)
浅拷贝只是将对象的外层进行一个拷贝,内层的变长数据不做拷贝,仍然引用原地址数据
import copy
a = [1,"2",3,['a','b']]
c = copy.copy(a)
print("a.id:%d, a[3].id:%d" % (id(a),id(a[3])))
print("c=copy(a) >> c.id:%d, c[3].id:%d " % (id(c),id(c[3])))
看以上的例子,a为一个列表,其中的a[3]元素也是列表,由于是浅拷贝,对外层拷贝的话只是对列表a进行一次拷贝,里面的a[3]元素并不拷贝,仍然指向原有地址,我们看一下结果:
a.id:48544520, a[3].id:50941736
c=copy(a) >> c.id:50956296, c[3].id:50941736
所以我们看到对象a 与 对象c在内存中的地址是不一样的,但是a[3]与c[3]的地址在内存中指向同一个地址。
深拷贝(Deep Copies)
和浅拷贝区别的一点,深拷贝不仅拷贝外层,对对象里面的元素对象也进行拷贝
import copy
a = [1,"2",3,['a','b']]
b = copy.deepcopy(a)
print("b=deepcopy(a) >> b.id:%d, b[3].id:%d " % (id(b),id(b[3])))
运行结果:
a.id:48544520, a[3].id:50941736
b=deepcopy(a) >> b.id:48729096, b[3].id:50970696
可以看到, b 在内存中的地址 与 b中元素b[3]的地址与a的地址均不一样,是在内存中独立开辟的一块地址。