本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-12(12)

2021-01(39)

深拷贝浅拷贝

发布于2019-08-05 18:26     阅读(140)     评论(0)     点赞(1)     收藏(5)



在说深拷贝浅拷贝之前,先说一下什么是可变对象,什么是不可变对象

对象的数据是允许被修改的就是可变(mutable)对象,反之就是不可变(immutable)对象

例如像列表,字典就是可变对象,像字符串,数字,元组就是不可变对象

下面再来说拷贝,浅拷贝只拷贝最外层对象,深拷贝还会递归拷贝内层对象

当最外层对象和它的子元素都是不可变(immutable)对象时,无法产生新对象,所以不存在被拷贝

下面分别分四种情况来说明深拷贝,浅拷贝

一、浅拷贝

1.顶层是mutable,内层全是immutable

(1)创建列表对象并赋值给变量a

(2)导入copy模块,使用copy.copy()函数浅拷贝a,并赋值给变量b

(3)修改a的子元素a[0]=3,由于整数是不可变对象,所以并不是修改1变为3,而是更改a[0]指向对象3

(4)浅拷贝只拷贝最外层,所以a的id和b的id是不相同的,但a中存储的对象id和b存储的对象id是相同的,除了a[0],因为a[0]已经修改过

2.顶层是mutable,内层部分是immutable

 

 因为浅拷贝只拷贝最外层对象(a的id和b的id不一样),所以a[2],b[2]指的是同一个列表,因为列表是可变的所以a[2][1]变了,b[2][1]也变了

3.顶层是immutable,内层全是immutable

 

 当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1,2,3)

变量a与变量b指的是同一个元组对象,没有拷贝(元组中的对象是不能被修改的)

4.顶层是immutable,内层部分是immutable

 

变量a和变量b指向的是相同的元组对象,因为元组是不可变的,a的id和b的id是相同的,并且a[2],b[2]指向的是同一个列表所以修改了a[2][1]会影响了b[2][1]

 

二、深拷贝

1.顶层是mutable,内层全是immutable

(1)导入copy模块,使用copy.deepcopy()函数深拷贝a,并赋值给变量b

(2)变量a和变量b指向不同的列表对象(a,b的id不同),但由于子元素是不可变对象,所以子元素id相同,除了a[0],a[0]已经指向另外一个对象了,所以不会影响b[0]

2.顶层是mutable,内层部分是immutable

深拷贝即拷贝了顶层对象,又递归拷贝了子元素对象,所以a[2],b[2]指向了两个不同的列表对象(但是不可变对象的id是一样的),修改了a[2][1]='china'后,它重新指向了新的字符串对象,不会影响到b[2][1]

 3.顶层是immutable,内层全是immutable

 

变量a和变量b指向的是同一个元组对象,不存在拷贝

4.顶层是immutable,内层部分是immuta

 

注意,此处就有些意思了,元组是不可变对象,a的id值和b的id值却不同,这说明a和b是两个不同的元组对象,前面我们说到不可变对象是不能被拷贝的,为什么这里可以了

原因是深拷贝即拷贝了顶层对象,又递归拷贝了子元素对象。因为子元素对象中有可变对象列表,拷贝了子元素对象之后,顶层对象自然而然的就被拷贝了,同时a[2]与b[2]指向的是不同的列表对象,所以修改了a[2][1]不会影响到b[2][1]

 







所属网站分类: 技术文章 > 博客

作者:gogogo

链接:https://www.pythonheidong.com/blog/article/6242/b91f0b20c568451248c0/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)