大家好,欢迎来到IT知识分享网。
1、什么是深浅拷贝
深拷贝和浅拷贝,python中一切皆对象,像数字,字符串,元祖,如果在内存中存储了这些元素,那么这块内存中的值是不可以被修改的,但是还存在一些可变对象,比如列表和字典,他们所占有的内存空间是可以修改的,有因为python中使用的是引用计数去节省内存。
首先我们定义一个列表并引用:
>>> list = [1,2,[1,2]]
>>> list1 = list
>>> id(list)
5832
>>> id(list1)
5832
注:id函数的意思是返回对象object的标识符,标识符类型为整数,在同一个时间里所有对象的标识符是唯一的,如果在不同生命周期的对象有可能有相同的标识符。
例如:我们把list中的第一个数改变的话我们发现list1也随之改变,问什么会出现这种情况呢,这是因为python中使用的是引用计数去节省内存。(这句话上面提到过)
>>> list[0] = ‘a’
>>> list
[‘a’, 2, [1, 2]]
>>> list1
[‘a’, 2, [1, 2]]
但是我们往往只想修改list而不改变list1,怎么实现呢我们可以通过切片拷贝
2、浅拷贝
切片方式实现浅拷贝
首先我们删除list1
>>> del list1 #使用del函数
>>> list
[‘a’, 2, [1, 2]]
>>> list1 = list[:] #将list切片赋值给list1
>>> list
[‘a’, 2, [1, 2]]
>>> list1
[‘a’, 2, [1, 2]]
>>> id(list)
5832 #查看id
>>> id(list1)
5896 #查看id发现和list不一样
接下来我们只改变list中的值
>>> list[0] = ‘b’
>>> list
[‘b’, 2, [1, 2]] #我们将list[0]改为字符b
>>> list1
[‘a’, 2, [1, 2]] #这时候我们发现list1中的值并未改变
但是这样只适合外层拷贝,接下来我们将里层的列表修改看看会发生什么
首先我们删除list1,并重新赋值
>>> del list1
>>> list
[‘b’, 2, [1, 2]]
>>> list1 = list[:] #切片赋值
>>> list1
[‘b’, 2, [1, 2]]
>>> list[-1][0] = ‘c’ #将list[-1][0]修改为字符c
>>> list
[‘b’, 2, [‘c’, 2]]
>>> list1
[‘b’, 2, [‘c’, 2]] #我们发现虽然我们切片操作了,但是对于里层的列表却没改变
总结一下:当你使用切片操作拷贝的时候,我们修改了外层的列表,外层不随之改变,但是修改里层的子列表时,却会改变。
除此之外浅拷贝还有第二种方式,及插入copy模块
copy模块实现浅拷贝
首先我们删除列表,并插入模块
>>> del list
>>> del list1
>>> import copy
定义列表并对外层内层赋值
>>> list = [1,2,[1,2]]
>>> list1 = copy.copy(list) #使用copy模块实现赋值
>>> list
[1, 2, [1, 2]]
>>> list1
[1, 2, [1, 2]]
>>> list[-1][0] = ‘a’ #里层赋值
>>> list[0] = ‘b’ #外层赋值
>>> list
[‘b’, 2, [‘a’, 2]]
>>> list1
[1, 2, [‘a’, 2]] #这里我们发现外层没有随之改变,但是里层却跟着变了,这就是copy模块实现浅拷贝,但是我们想实现互不影响那我们使用深拷贝
3、深拷贝
使用deepcopy函数
首先我们删除list1并重新赋值
>>> del list1
>>> list
[‘b’, 2, [‘a’, 2]]
>>> list1 = copy.deepcopy(list)
>>> list
[‘b’, 2, [‘a’, 2]]
>>> list1
[‘b’, 2, [‘a’, 2]]
>>> list[0] = ‘c’ #对list[0]修改,修改的是外层
>>> list[-1][0] = ‘d’ #对list[-1][0]修改,修改的是内层
>>> list
[‘c’, 2, [‘d’, 2]]
>>> list1
[‘b’, 2, [‘a’, 2]] #这里我们发现对list赋值后,list内层外层都没有随之改变这就是深拷贝。
4、总结:
浅拷贝:不会拷贝数据中的子对象
切片拷贝,import copy copy.copy()
深拷贝:会拷贝数据中的子对象
import copy.deepcopy
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/165448.html