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

深浅Copy的理解

作者头像
GhostCN_Z
发布2020-04-03 13:16:17
4250
发布2020-04-03 13:16:17
举报
文章被收录于专栏:GhostCN_Z

在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。

而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。

而深浅拷贝有三种情况:拷贝的是不可变对象、拷贝的是可变对象、拷贝的可变对象里面还有子对象

拷贝不可变对象

代码语言:javascript
复制
import copy
list0 = 'hello,world'
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0

print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

对list0()进行修改:list0 = list0 + 'good evening'

发现即使修改了list0,其他的值也不会变,地址也没有改变。

结论:对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。

拷贝可变对象

代码语言:javascript
复制
import copy
list0 = [1,2,3,4,5,6]
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0

print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

对于可变对象来说:

  赋值(我们暂且称它为’=浅拷贝’)的新对象与原对象相比,值相等,地址也相等;   浅拷贝:与原对象相比,值相等,地址不相等;   深拷贝:与原对象相比,值相等,地址不相等。

拷贝可变对象中还存在子对象的

代码语言:javascript
复制
import copy
list0 = [1,2,3,4,5,6, ['a', 'b']]
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0
list0[6].append('c')
print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

结论:浅拷贝没有拷贝子对象,所以原对象发生改变,其子对象也发生了改变,而深拷贝拷贝了子对象,原对象发生改变,其本身也不会改变。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 拷贝不可变对象
  • 拷贝可变对象
  • 拷贝可变对象中还存在子对象的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档