Python 深淺複製

2021-08-15 19:00:45 字數 1680 閱讀 2472

python中的賦值語句不複製物件,它們在目標和物件之間建立繫結。

對於可變的或包含可變項的容器,有時需要乙個副本,所以可以改變乙個副本而不改變另乙個。

將建立乙個新物件,但它包含的是對原始物件包含的項的引用。

a =  

b = list(a)

c=a.copy()

d = copy.copy(a)

建立乙個新物件,並且遞迴的複製他包含的所有物件。

import copy 

b =

a = copy.deepcopy(b)

當原始物件中包含可變物件a,淺複製僅僅複製對a的引用

這時,如果a的值更改,那麼相應新物件中a的值也會更改

>>> a=[1,2,3]

>>> b =     #字典b的value都是可變物件

>>> c = copy.copy(b)        #淺複製

>>> d = copy.deepcopy(b)    #深複製

>>> a.pop()                #修改a

3>>> b

#原始物件b改變

>>> c

#淺複製c同樣發生改變

>>> d

#深複製d不變

>>> b

>>> c

>>> d

標識相當於記憶體中物件中的位址

>>> id(a)

50285512

>>> id(b['y'])

50285512

>>> id(c['y'])       

50285512

>>> id(d['y'])

49946056

可以發現原始物件b['y']和淺複製物件c['y']的標識相同,和a引用同乙個值,而深複製物件d['y']引用的是乙個新的值

所以將a新增到淺複製物件c['y']中會導致遞迴引用

>>> a

[1, 2]

>>> c

#c['y']出現遞迴引用

>>> a.pop()        #刪除a中對a的引用

[1, 2]

>>> d

#d['y']和a引用的不是乙個值,所以不會發生詆毀引用

def mycopy(x):

'''淺複製函式,接受list,tuple,set,dict型別的引數'''

types =

cls = type(x)

if cls in types:

n = [item for item in x]

return cls(n)

elif cls is dict:

return

raise typeerror

python深淺複製 Python中的深淺拷貝

1.什麼是深淺拷貝?python中一切皆物件,python中的數字 字串 元組等,如果存放在了記憶體中,這部分記憶體裡面的內容是不會改變的,但是也有情況,記憶體中存放了可變物件,比如說列表和字典,他們的記憶體空間是可以被修改的。下面我們定義乙個列表 list 1,2,3,4,5 list1 list...

oc 深淺複製

淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...

深淺複製 2

前面講了深淺複製的概念,而實操中我們會遇到更多的情況 我們可以看到這兩個copywithzone方法在arc下已經是放棄了,這兩個方法的使用非常簡單,一般的格式如下 1.實現nscopying協議 2.實現copywithzone方法 3.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...