前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python浅拷贝和深拷贝

python浅拷贝和深拷贝

作者头像
py3study
发布2020-01-15 11:14:03
4120
发布2020-01-15 11:14:03
举报
文章被收录于专栏:python3python3

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

浅拷贝copy()

代码语言:javascript
复制
#!/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()

代码语言:javascript
复制
#!/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,表面好像也看不出什么区别来。

代码语言:javascript
复制
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']

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

代码语言:javascript
复制
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有对应的指向,所以就显示出来了。对于深拷贝来说没有任何改变,因为深拷贝是新建一个列表,把原列表的内容原封不动拷过来,拷过来以后它和原列表一模一样,至于原列表后来做了什么改变根本不关它的事。形象理解就是浅拷贝是活的,深拷贝是死的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档