python中的copy模組 淺複製和深複製

2021-07-04 12:22:30 字數 1324 閱讀 6137

在總結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....