设为首页 收藏本站
查看: 764|回复: 0

[经验分享] python浅拷贝和深拷贝

[复制链接]

尚未签到

发表于 2018-8-8 12:06:40 | 显示全部楼层 |阅读模式
  python中的赋值是按引用来传递的,如果不是赋值而是拷贝,那就需要用到copy模块了,这就不得不谈浅拷贝和深拷贝了。
  浅拷贝copy()
  


  • #!/usr/bin/python

  • import copy

  • class MyClass:
  •     def __init__(self, name):
  •         self.name = name
  •     def __cmp__(self, other):
  •         return cmp(self.name, other.name)

  • a = MyClass('a')
  • my_list = [a]
  • dup = copy.copy(my_list)

  • print '             my_list:', my_list
  • print '                 dup:', dup
  • print '      dup is my_list:', (dup is my_list)
  • print '      dup == my_list:', (dup == my_list)
  • print 'dup[0] is my_list[0]:', (dup[0] is my_list[0])
  • print 'dup[0] == my_list[0]:', (dup[0] == my_list[0])
  

  结果:
  my_list: [<__main__.MyClass instance at 0x00BA5530>]
  dup: [<__main__.MyClass instance at 0x00BA5530>]
  dup is my_list: False
  dup == my_list: True
  dup[0] is my_list[0]: True
  dup[0] == my_list[0]: True
  深拷贝deepcopy()
  


  • #!/usr/bin/python

  • import copy

  • class MyClass:
  •     def __init__(self, name):
  •         self.name = name
  •     def __cmp__(self, other):
  •         return cmp(self.name, other.name)

  • a = MyClass('a')
  • my_list = [a]
  • dup = copy.deepcopy(my_list)

  • print '             my_list:', my_list
  • print '                 dup:', dup
  • print '      dup is my_list:', (dup is my_list)
  • print '      dup == my_list:', (dup == my_list)
  • print 'dup[0] is my_list[0]:', (dup[0] is my_list[0])
  • print 'dup[0] == my_list[0]:', (dup[0] == my_list[0])
  

  结果:
  my_list: [<__main__.MyClass instance at 0x00BA5530>]
  dup: [<__main__.MyClass instance at 0x00BA5620>]
  dup is my_list: False
  dup == my_list: True
  dup[0] is my_list[0]: False
  dup[0] == my_list[0]: True
  浅拷贝和深拷贝都是copy,表面好像也看不出什么区别来。
  


  • import copy

  • list1 = ['a','b','c']
  • list2 = copy.copy(list1)
  • list3 = copy.deepcopy(list1)

  • print list1
  • print list2
  • print list3
  

  结果:
  ['a', 'b', 'c']
  ['a', 'b', 'c']
  ['a', 'b', 'c']
  如果只是简单的拷贝一下没有后续操作,那么随便拷贝都行。浅拷贝和深拷贝都是为后续操作而区分的。
  


  • import copy

  • list1 = ['a','b','c',['d','e']]
  • list2 = copy.copy(list1)
  • list3 = copy.deepcopy(list1)

  • list1.append('f')
  • list1[3].append('x')

  • print list1
  • print list2
  • print list3

  • list4 = list1
  • print list4
  

  结果:
  ['a', 'b', 'c', ['d', 'e', 'x'], 'f']
  ['a', 'b', 'c', ['d', 'e', 'x']]
  ['a', 'b', 'c', ['d', 'e']]
  ['a', 'b', 'c', ['d', 'e', 'x'], 'f']
  从这就能看出来,就以列表为例,如果浅拷贝,那么系统就新建一个列表,它的每个元素都指向原来列表的每个元素(就像C语言里的指针数组),输出的时候就把它各元素指向的母体元素内容显示出来,所以list1追加了f元素以后list2并没有显示,因为list2里并没有指向这个新元素的元素。但是追加了x以后显示出来了,因为x属于list1的第三个元素的一部分,在list2有对应的指向,所以就显示出来了。对于深拷贝来说没有任何改变,因为深拷贝是新建一个列表,把原列表的内容原封不动拷过来,拷过来以后它和原列表一模一样,至于原列表后来做了什么改变根本不关它的事。形象理解就是浅拷贝是活的,深拷贝是死的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548649-1-1.html 上篇帖子: python 多线程实现定期更新ip库 下篇帖子: python基础教程项目1:及时标记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表