python 浅copy与深copy_python之copy模块与深、浅拷贝

copy模块

使用copy模块来实现复制功能。

复制方法分为浅拷贝与深拷贝:

浅拷贝,

copy.copy(object)

对内存地址进行复制,目标对象和源对象指向同一内存片内存空间。

深拷贝,

copy.deepcopy(object)

为复制生成的对象也申请一个单独的内存空间,内存地址是自主分配的。

完成复制后,目标对象和源对象虽然存储数据是一样的,但是内存地址不同。

两个对象互不干涉。

例:

>>> jack = ['jack', ['age', '20']]

>>> import copy

//深拷贝>>> james = copy.deepcopy(jack)

>>> james[0] = 'james'

>>> print jack, james

['jack', ['age', '20']] ['james', ['age', '20']]

>>> james[1][1] = 18

>>> print jack, james

['jack', ['age', '20']] ['james', ['age', 18]]

这时候他们之间就不会互相影响了。打印出每个人的内部元素每个id:

>>> [id(x) for x in jack]

[139132064, 3073507244L]

>>> [id(x) for x in james]

[139141632, 139157548]

他们的内部元素也都指向了不同的对象。

//浅拷贝

>>> love = copy.copy(jack)

>>> love[0] = 'love'

>>> print jack, love

['jack', ['age', '20']] ['love', ['age', '20']]

>>> james[1][1] = 18

>>> print jack, love

['jack', ['age', '18']] ['love', ['age', 18]]

用切片和list方法实现浅拷贝

>>> jack = ['jack', ['age', 20]]

>>> james = jack[:]

>>> anny = list(jack)

观察三者的id值,三者是不同的对象。

>>> print id(jack), id(tom), id(anny)

144846988 144977164 144977388

修改每个值中的名称并再次观察

>>> james[0] = 'james'

>>> anny[0] = 'anny'

>>> print jack, james, anny

['jack', ['age', 20]] ['james', ['age', 20]] ['anny', ['age', 20]]

看起来一切正常,在为james和anny重新命名的时候,会重新创建一个’james’和’anny’对象,替换旧的’jack’对象。

但anny只有18岁,重新为anny定义岁数。

>>> anny[1][1] = 18

>>> print jack, james, anny

['jack', ['age', 18]] ['james', ['age', 18]] ['anny', ['age', 18]]

很奇怪的情况,jack、james、anny的岁数都发生了改变,变成了18了。jack、tom、anny他们应当都是不同的对象,怎么会互相影响呢?看下jack,james,anny的内部元素每个元素id:

>>> [id(x) for x in jack]

[3073896320L, 3073777580L]

>>> [id(x) for x in james]

[144870744, 3073777580L]

>>> [id(x) for x in anny]

[144977344, 3073777580L]

由于list的第一个元素是不可变类型,所以will对应的list的第一个元素会使用一个新的对象39758496

但是list的第二个元素是一个可变类型,修改操作不会产生新的对象,所以修改结果会相应的反应到其他的上面。

注:使用=号仅仅在源对象的标签上又加了一层标签生成目标对象,其通过源对象的标签来获取值。

结:

使用切片[:]操作、使用工厂函数(如list/dir/set)、使用copy模块中的copy()函数实现拷贝就叫浅拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。

利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值