Python基础知识—深复制与潜复制
1、看三个例子
首先我们先观察三个例子!
- 第一个,利用
copy
函数,然后改变_l
列表的值,输出发现,只有列表_l的值改变了,列表l的值并未跟着改变
l = [1, 2, 3]
_l = l.copy()
_l[0] = -1
print(_l)
print(l)
[-1, 2, 3]
[1, 2, 3]
- 第二个,在列表l中存入列表,再将其拷贝
l = [[1], [2], 3]
_l = l.copy()
_l[0][0] = -1
_l[2] = 4
print(_l)
print(l)
[[-1], [2], 4]
[[-1], [2], 3]
发现了什么?改变列表_l中的列表中的值时,列表l中的值也跟着改变了,而改变列表_l中的值时,列表l的值却不跟着改变,继续向下看
- 第三个,在列表中存入实例看看
class File:
def __init__(self, name):
self.name = name
audio = File("mp3")
file = File("txt")
l = [audio, file]
_l = l.copy()
_l[0].name = "mp4"
print(audio.name)
mp4
可以发现,改变列表中实例的属性值,实例原本的属性值也会跟着改变
其实这中差异就是深拷贝和浅拷贝
2、深拷贝与浅拷贝
深拷贝(Deep Copy),浅拷贝(Shallow Copy)
- 深拷贝:就是照着原来的东西又创建了一个东西,这时候就有了俩个物体,互不影响
- 浅拷贝:浅拷贝复制出来的其实就是原来东西的代称,或者说是指针,指向原来的那个物体,这时还是只有原来的那一个物体,我复制的只是它的一个”代称“,”影子“,能通过它找到原来的物体就好
所以,以上面的三个例子来看,列表中的列表,以及列表中的Class实例,都是浅拷贝
而列表中的数值却是深拷贝
- 为什么复制数值时是深拷贝?
因为这是Python的规定,约定,列表中直接存放的数值,字符和存class实例,列表,字典不同。对于数值字符的复制,是直接复制的值,而不是一个shallow
- 那么如何使得浅拷贝变为深拷贝呢?
很简单,Python有一个copy的库,引入其中的deepcopy
,然后就能实现完全的深拷贝了
from copy import deepcopy
l = [[1], [2], [3]]
_l = deepcopy(l)
_l[0][0] = -1
print(_l)
print(l)
[[-1], [2], 3]
[[1], [2], 3]
浅复制的优势:快!!!不用耗费多少内存和时间
参考:莫烦Python
扫描二维码关注公众号,回复:
13607902 查看本文章