python模块系列之 - copy

      在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的地址均不一样,是在内存中独立开辟的一块地址。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值