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

2021-10-19 03:21:49 字數 1504 閱讀 5254

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.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...