python之copy模块与深拷贝、浅拷贝
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python之copy模块与深拷贝、浅拷贝,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2810字,纯文字阅读大概需要5分钟。
内容图文
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]]
>>> jack.append([‘sex‘,‘man‘])
>>> print jack
[‘jack‘, [‘age‘, ‘20‘], [‘sex‘, ‘man‘]]
>>> print love
[‘jack‘, [‘age‘, ‘20‘]]
copy()方法将源对象变量的内存数值复制给目标对象,两个对象共享同一存储区。
浅拷贝是创建一个新对象,但没有为新对象创建数据区。
因其中第一个元素字符串是不可变类型,所以更改会生成一个新的对象;第二个元素列表是可变类型,所以是在修改原来的对象。
浅拷贝后,在源对象中添加元素,目标对象不会受到影响。
用切片和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的第一个元素是不可变类型,所以源对象对应的list的第一个元素会使用一个新的对象。
但是list的第二个元素是一个可变类型,修改操作不会产生新的对象,所以修改结果会相应的反应到其他的上面。
一个综合的例子:
import copy
a = [1,2,3,[‘a‘,‘b‘]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(4)
a[3].append(‘c‘)
print a,b,c,d
输出结果为:
[1,2,3,[‘a‘,‘b‘,‘c‘],4] [1,2,3,[‘a‘,‘b‘,‘c‘],4] [1,2,3,[‘a‘,‘b‘,‘c‘]]
[1,2,3,[‘a‘,‘b‘]]
结:
-
使用切片[:]操作、使用工厂函数(如list/dir/set)、使用copy模块中的copy()函数实现拷贝就叫浅拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。
注:使用=号仅仅在源对象的标签上又加了一层标签生成目标对象,其通过源对象的标签来获取值。
本文出自 “墨” 博客,请务必保留此出处http://jinyudong.blog.51cto.com/10990408/1916494
原文:http://jinyudong.blog.51cto.com/10990408/1916494
内容总结
以上是互联网集市为您收集整理的python之copy模块与深拷贝、浅拷贝全部内容,希望文章能够帮你解决python之copy模块与深拷贝、浅拷贝所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。