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
標識相當於記憶體中物件中的位址
可以發現原始物件b['y']和淺複製物件c['y']的標識相同,和a引用同乙個值,而深複製物件d['y']引用的是乙個新的值>>> id(a)
50285512
>>> id(b['y'])
50285512
>>> id(c['y'])
50285512
>>> id(d['y'])
49946056
所以將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.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...