在總結copy模組中的淺複製(copy)和深複製(deepcopy)前,先對「引用」做下說明:
引用是指儲存的值為物件的位址。在 python 語言中,乙個變數儲存的值除了基本型別儲存的是值外,其它都是引用,因此對於它們的使用就需要小心一些。下面舉個例子:
問題描述:已知乙個列表,求生成乙個新的列表,列表元素是原列表的複製。
a=[1,2]
b=a
這種做法其實並未真正生成乙個新的列表,b指向的仍然是a所指向的物件。這樣,如果對a或b的元素進行修改,a,b的值同時發生變化。
a=[1,2]
b=a[:]
這樣修改a對b沒有影響。修改b對a沒有影響。
但 這種方法只適用於簡單列表,也就是列表中的元素都是基本型別,如果列表元素還存在列表的話,這種方法就不適用了。原因就是,象a[:]這種處理,只是將列 表元素的值生成乙個新的列表,如果列表元素也是乙個列表,如:a=[1,[2]],那麼這種複製對於元素[2]的處理只是複製[2]的引用,而並未生成[2]的乙個新的列表複製。為了證明這一點,測試步驟如下:
>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]
可見,對a的修改影響到了b。如果解決這一問題,可以使用copy模組中的deepcopy函式。修改測試如下:
>>> import copy
>>>a=[1,[2]]
>>>b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a
[1, [2, 3]]
>>> b
[1, [2]]
########
copy(x)潛複製
建立新的復合物件並通過引用複製x的成員來建立x的潛複製,它複製了物件,但對於物件中的元素,依然使用引用。對於內建型別,此函式並不經常使用。而是使用諸如list(x), dict(x), set(x)等呼叫方式來建立x的淺複製,要知道像這樣直接使用型別名顯然比使用copy()快很多。但是它們達到的效果是一樣的。
判斷物件之間是否是拷貝,可以用下面方法:
a is b ->true a與b引用的是同乙個物件,不是拷貝;
-> false a與b是彼此拷貝物件;
引出例子來說明:
deepcopy()函式
完全的拷貝乙個物件和乙個物件的所有元素的值, 通過建立新的復合物件並重複複製x的所有成員來建立x的深複製。
python中的copy模組理解
學習簡單而使用的copy模組 copy模組中只有兩個方法 copy.copy和copy.deepcopy,分別稱之為淺拷貝和深拷貝,以澡堂子為例來解釋。import copy 1.copy.copy a 1,2,3,x y a引用 租賃 使用 這個澡堂子的四個隔間 位址 其中 x y 是乙個包間,適...
Python 淺拷貝與深拷貝,copy模組
python中的任何變數都是物件 引用型別 python中的變數分為可變型別和不可變型別。淺拷貝和深拷貝都是拷貝可變型別內容,不可變型別不會拷貝 注意 因為元組是不可變型別,所以元組的淺拷貝並不會拷貝任何內容,而是直接引用源元組 和 賦值等同 如果元組中的元素都是不可變型別,那麼元組的深拷貝也並不會...
關於python深copy與淺copy的一點理解
一直對python深copy和淺copy似懂非懂的狀態,看了這篇文章,覺得自己懂了很多,給各位參考!出處 import copy a 1 不可變資料型別 copy a copy.copy a print id a id copy a 記憶體位址相同 a 1,2 可變資料型別 copy a copy....