1.什麼是深淺拷貝?
python中一切皆物件,python中的數字、字串、元組等,如果存放在了記憶體中,這部分記憶體裡面的內容是不會改變的,但是也有情況,記憶體中存放了可變物件,比如說列表和字典,他們的記憶體空間是可以被修改的。
下面我們定義乙個列表:
list=[1,2,3,4,5]
list1=list
list[0]=6
>>>list
[6,2,3,4,5]
>>>list1
[6,2,3,4,5]
如果我們只想改變list,問題就出現了。
賦值操作 list1 = list,是淺拷貝,當list的值改變的時候,list1的值跟著改變。
2.用for和[:]實現淺拷貝
list = [1,2,3,4,5]
list2= [ i for i in list] //list2=list[:]
list2[-1]=0
>>> list
>>> list2
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 0]
上面的例子,用for迴圈生成新的list2物件或者[:]切片賦值得到的list2,當改變list2的值時,list的值沒有跟著改變,這就是深拷貝嗎?且繼續往下看:
3.list = [1, 2, 3, [1,2009] ]
list3 = [ i for i in list] //list2=list[:]
>>> list
>>> list3
[1, 2, 3, [1, 2009, 2009]]
[1, 2, 3, [1, 2009, 2009]]
3 和 2難道有矛盾?不。
解釋:for迴圈操作的時候,把list中的每乙個物件的引用拷貝,而list中的前3個元素是字串物件,在python中,字串物件賦值操作是:變數指向存放字串的位址,所以看起來好像是深拷貝,實際上還是淺拷貝,若不信,請繼續往下看:
for i in list:
print id(i)
for i in list3:
print id(i)
那麼,在pyhton,深拷貝在哪呢?不急,下面就是了
5.import copy
list= [1, 2, 3, [1,2009] ]
list5 = copy.deepcopy(list)
>>> list
[1, 2, 3, [1, 2009]]
>>> list5
[1, 2, 3, [1, 2009]]
>>> list5
[1, 2, 3, [1, 2009, 2009]]
>>> list
[1, 2, 3, [1, 2009]]
6.總結:
淺拷貝不會拷貝資料中的子物件。
例如:for ,切片淺拷貝,impord copy copy.copy
深拷貝會拷貝資料中的子物件
例如:impord copy.deepcopy
Python 深淺複製
python中的賦值語句不複製物件,它們在目標和物件之間建立繫結。對於可變的或包含可變項的容器,有時需要乙個副本,所以可以改變乙個副本而不改變另乙個。將建立乙個新物件,但它包含的是對原始物件包含的項的引用。a b list a c a.copy d copy.copy a 建立乙個新物件,並且遞迴的...
oc 深淺複製
淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...
深淺複製 2
前面講了深淺複製的概念,而實操中我們會遇到更多的情況 我們可以看到這兩個copywithzone方法在arc下已經是放棄了,這兩個方法的使用非常簡單,一般的格式如下 1.實現nscopying協議 2.實現copywithzone方法 3.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...