Python3 - 深拷贝,浅拷贝

浅拷贝

不一定生成新的对象:

  1. 若被拷贝的对象是可变的,则会生成新的对象;
  2. 若被拷贝的对象是不可变的,则不会生成新的对象;
  3. 并且只会对第一层进行拷贝

<1> 被拷贝的对象是可变的

>>> import copy
>>>
>>> a = [1,2,3]
>>>
>>> b = copy.copy(a)
>>> 
>>> 4397017568
>>> id(a)
4400783688
>>> id(b)
4400752456

可以看到a和b 的地址不同,说明产生了新的对象

<2> 被拷贝的对象是不可变的

>>> a = (1,2,3)
>>>
>>> b = copy.copy(a)
>>>
>>> id(a)
4400776896
>>> id(b)
4400776896
>>>
>>>

可以看到a和b 的地址相同,说明没有产生了新的对象

<3> 并且只会对第一层进行拷贝


>>> a = [1,2,3]
>>>
>>> b = [6,7,8]
>>>
>>>
>>> c = [a,b]
>>>
>>> e = copy.copy(c)
>>> id(c)
4400752584
>>>
>>> id(e)
4400785544
>>>
>>>
>>> a.append(4)
>>>
>>> a
[1, 2, 3, 4]
>>>
>>> b
[6, 7, 8]
>>>
>>> c
[[1, 2, 3, 4], [6, 7, 8]]
>>>
>>> e
[[1, 2, 3, 4], [6, 7, 8]]
>>>

通过id(c)id(e)可知产生了新的对象,然后a.append(4)后打印ce发现都改了,说明只是对一层进行了拷贝

深拷贝

一定产生了新的对象

>>> a = [1,2,3]
>>> b = [6,7,8]
>>> c = [a,b]
>>> e = copy.deepcopy(c)
>>> a.append(4)
>>> c
[[1, 2, 3, 4], [6, 7, 8]]
>>> e
[[1, 2, 3], [6, 7, 8]]
>>>
>>>
可变对象 不可变对象
copy 产生新的对象 没有产生新的对象
Deepcopy 产生新的对象 产生新的对象
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 1、对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接...
    滴答大阅读 785评论 0 2
  • 感恩身心健美的陪伴着我*感恩网络给我们提供便捷的学习途径*感恩提供善知识的人们*感恩钱宝贝让我有丰盛的生活能给予家...
    晴晴zhang阅读 111评论 0 0
  • 各大平台商家,内部员工忙前忙后,准备着101购物狂欢节,在出大量的文案、策划,设计各种各样的banner、宣传海报...
    Aaron35阅读 224评论 0 2
  • Marcel Remy与他的两个儿子Yves和Claude,在2016年2月的第一周,以攀登的方式来庆祝自己93岁...
    Curve曲线运动阅读 399评论 0 0