文章目錄
- 潛拷貝(shallow copy)
- 深拷貝(deep copy)
總結一下python的淺拷貝和深拷貝.
潛拷貝(shallow copy)
python中潛拷貝指的是:構造一個新的復合對象,然后將原對象中的對象引用插入其中
平常開發過程中潛拷貝是比深拷貝更常見的場景.
比如編程中使用到的一些基本的復合類型(list, dict等)是自帶shallow copy函數的,比如下面的例子
from collections import dequel = [1,2,3]
l.copy()
s = set([1,2,3])
s.copy()
d = {'a':1,'b':2}
d.copy()
q = deque([1, 2, 3])
q.copy()
python官方有copy這個內置的模塊來完成潛拷貝和深拷貝.如下例子
from collections import deque
import copy
from dataclasses import dataclass@dataclass
class Test:name: strage: intdef test2():l = [Test(name='a', age=1), Test(name='b', age=2)]l_copy = copy.copy(l)print(id(l))print(id(l_copy))l[0].name = 'a_update'print(l_copy[0].name == l[0].name)if __name__ == '__main__':test2()
輸出
138121816082688
138121816084736
True
列表類型潛拷貝還可以使用分片語法比如l_copy = l[:]
也是潛拷貝.
深拷貝(deep copy)
python中深拷貝是指:構造一個新的復合對象,然后遞歸地插入原對象中對象的副本
使用copy.deepcopy
實現,如下例子:
from collections import deque
import copy
from dataclasses import dataclass@dataclass
class Test:name: strage: intdef test3():l = [Test(name='a', age=1), Test(name='b', age=2)]l_copy = copy.deepcopy(l)print(id(l))print(id(l_copy))l[0].name = 'a_update'print(l_copy[0].name == l[0].name)if __name__ == '__main__':test3()
輸出結果:
123638090725824
123638090725952
False