文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python浅拷贝和深拷贝

2023-01-31 00:59

关注

python中的赋值是按引用来传递的,如果不是赋值而是拷贝,那就需要用到copy模块了,这就不得不谈浅拷贝和深拷贝了。

 

浅拷贝copy()

 

  1. #!/usr/bin/python 
  2.  
  3. import copy 
  4.  
  5. class MyClass: 
  6.     def __init__(self, name): 
  7.         self.name = name 
  8.     def __cmp__(self, other): 
  9.         return cmp(self.name, other.name) 
  10.      
  11. a = MyClass('a') 
  12. my_list = [a] 
  13. dup = copy.copy(my_list) 
  14.  
  15. print '             my_list:', my_list 
  16. print '                 dup:', dup 
  17. print '      dup is my_list:', (dup is my_list) 
  18. print '      dup == my_list:', (dup == my_list) 
  19. print 'dup[0] is my_list[0]:', (dup[0] is my_list[0]) 
  20. 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()

  1. #!/usr/bin/python 
  2.  
  3. import copy 
  4.  
  5. class MyClass: 
  6.     def __init__(self, name): 
  7.         self.name = name 
  8.     def __cmp__(self, other): 
  9.         return cmp(self.name, other.name) 
  10.      
  11. a = MyClass('a') 
  12. my_list = [a] 
  13. dup = copy.deepcopy(my_list) 
  14.  
  15. print '             my_list:', my_list 
  16. print '                 dup:', dup 
  17. print '      dup is my_list:', (dup is my_list) 
  18. print '      dup == my_list:', (dup == my_list) 
  19. print 'dup[0] is my_list[0]:', (dup[0] is my_list[0]) 
  20. 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,表面好像也看不出什么区别来。

 

  1. import copy 
  2.  
  3. list1 = ['a','b','c'] 
  4. list2 = copy.copy(list1) 
  5. list3 = copy.deepcopy(list1) 
  6.  
  7. print list1 
  8. print list2 
  9. print list3 

结果:

['a', 'b', 'c']

['a', 'b', 'c']

['a', 'b', 'c']

 

 

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

  1. import copy 
  2.  
  3. list1 = ['a','b','c',['d','e']] 
  4. list2 = copy.copy(list1) 
  5. list3 = copy.deepcopy(list1) 
  6.  
  7. list1.append('f') 
  8. list1[3].append('x') 
  9.  
  10. print list1 
  11. print list2 
  12. print list3 
  13.  
  14. list4 = list1 
  15. 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有对应的指向,所以就显示出来了。对于深拷贝来说没有任何改变,因为深拷贝是新建一个列表,把原列表的内容原封不动拷过来,拷过来以后它和原列表一模一样,至于原列表后来做了什么改变根本不关它的事。形象理解就是浅拷贝是活的,深拷贝是死的。

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯