码迷,mamicode.com
首页 > 其他好文 > 详细

深拷贝、浅拷贝、引用(总结)

时间:2020-07-21 13:36:33      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:特殊   使用场景   传递   修改   字符   原来   总结   内存地址   使用   

变量的传递:

a = 2
a = b 是把b指向的数据给a
a和b的地址相同,最终a和b都指向2

 

浅拷贝:

c = 3
d=4
e=[c, d]
f=copy.copy(e)
e和f的内存地址不同,因为e. f是列表 列表是一个容器,容器也是有地址的
e和f的元素地址是相同的,e和f指向同一元素

 

深拷贝:
c=3
d=4
e=[c, d]
g=copy.deepcopy(e)
e和g的元素地址不同,深拷贝是复制了e的元素值,在新的内存中粘贴了数据,
所以虽然e和g的元素值相同,但是他们是不同的内存中的数据
即g和e的容器地址不同,容器中指向的元素地址也是不同的


深拷贝是递归拷贝,会拷贝最终指向的数据,而不是数据地址
深拷贝的使用场景:涉及到修改数据的时候,为了不影响原有数据,就可以使用深拷贝
对深拷贝后的数据进行修改,即不会对原有数据造成任何影响

 

特殊:对元组进行深拷贝、浅拷贝


1.元组中的元素都是不可变数据类型时【数字、字符串、元组】,无论对这个元组进行深拷贝或浅拷贝,最终都不会新建内存,不会新增数据,只是增加一个原数据的引用,原始元组、浅拷贝、深拷贝都是同一个地址

2.当元组中的元素存在可变数据类型时【列表】,
浅拷贝仍然是增加一个数据的引用,【注意,不像列表的浅拷贝那样新增了一个容器地址,元组浅拷贝后和原来的元组是同一个地址】
而深拷贝会创建一个新的元组容器,这个新元组中的元素,对于不可变数据【数字、字符串、元组),还是和原始元组中的元素同一个地址
但是可变数据元素【列表】和原始元组中的列表地址不同
但是这两个列表中的元素地址还是相同的

 

所以只要是不可变数据类型,无论深拷贝浅拷贝,增加的始终是对数据的引用,可以理解为数据的标签【变量名】增加了,不同的标签都指向同一个数据

如果是可变数据类型【列表】。深拷贝会增加新的内存【新的容器地址】,但是容器中的元素【如果是不可变数据类型的话】还是指向相同的数据

深拷贝、浅拷贝、引用(总结)

标签:特殊   使用场景   传递   修改   字符   原来   总结   内存地址   使用   

原文地址:https://www.cnblogs.com/come202011/p/13353947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!