简析Python中的深浅拷贝

简析Python中的深浅拷贝1 什么是深浅拷贝深拷贝和浅拷贝 python 中一切皆对象 像数字 字符串 元祖 如果在内存中存储了这些元素 那么这块内存中的值是不可以被修改的 但是还存在一些可变对象 比如列表和字典 他们所占有的内存空间是可以修改的 有因为 python 中

大家好,欢迎来到IT知识分享网。

1、什么是深浅拷贝

简析Python中的深浅拷贝

深拷贝和浅拷贝,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

(0)
上一篇 2024-12-31 19:15
下一篇 2024-12-31 19:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信