Python基础知识—深复制与潜复制

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

猜你喜欢

转载自blog.csdn.net/Mrwei_418/article/details/121152664
今日推荐