在python中,對於物件的拷貝,分為淺拷貝(copy)與深拷貝(deepcopy)兩種方式。淺拷貝由操作符「=」完成,或者由copy模組中的copy方法完成,而深拷貝由copy模組中的deepcopy方法承擔。
對於淺拷貝與深拷貝,如果拷貝物件都是不可變物件,則兩者沒有區別。
如果拷貝物件是可變物件,則淺拷貝只是拷貝了記憶體中物件的位址引用,而沒有拷貝實際物件的資料內容,所以對淺拷貝與拷貝源任意乙個進行修改,則另乙個也跟著被修改。
而深拷貝對可變物件進行拷貝時,則拷貝的不僅僅是可變物件的位址引用,而且還拷貝可變物件在記憶體中的資料,修改任意乙個物件,另乙個拷貝物件不受影響。
**演示:
>>
>
import copy
>>
> origin =[1
,2,[
3,4]
]#origin 裡邊有三個元素:1, 2,[3, 4]
>>
> cop1 = copy.copy(origin)
>>
> cop2 = copy.deepcopy(origin)
>>
> cop1 == cop2
true
>>
> cop1 is cop2
false
#cop1 和 cop2 看上去相同,但已不再是同乙個object
>>
> origin[2]
[0]=
"hey!"
>>
> origin[1
,2,[
'hey!',4
]]>>
> cop1[1
,2,[
'hey!',4
]]>>
> cop2[1
,2,[
3,4]
]#把origin內的子list [3, 4] 改掉了乙個元素,觀察 cop1 和 cop2
在自定義類時,可通過魔法方法__copy()__與__deepcopy()__來實現淺拷貝與深拷貝。
魔法方法__copy()__沒有任何引數,返回物件的淺拷貝。
魔法方法__deepcopy()__具有引數memo dictionary,返回物件的深拷貝。物件需要深拷貝的屬性值都通過memo dictionary傳遞給方法,以控制拷貝的遞迴迴圈,為了避免遞迴迴圈地拷貝資料結構,deepcopy使用備忘錄字典(memo dictionary)跟蹤已經被拷貝的資料結構。
import copy
import functools
@functools.total_ordering
class
myclass
:def
__init__
(self, name)
: self.name = name
def__copy__
(self)
:return myclass(self.name)
def__deepcopy__
(self, memo)
:return myclass(copy.deepcopy(self.name, memo)
)
a = myclass(
"name"
)sc = copy.copy(a)
dc = copy.deepcopy(a)
python的copy模組理解
首先直接上結論 我們尋常意義的複製就是深複製,即將被複製物件完全再複製一遍作為獨立的新個體單獨存在。所以改變原有被複製物件不會對已經複製出來的新物件產生影響。而淺複製並不會產生乙個獨立的物件單獨存在,他只是將原有的資料塊打上乙個新標籤,所以當其中乙個標籤被改變的時候,資料塊就會發生變化,另乙個標籤也...
python中的copy模組理解
學習簡單而使用的copy模組 copy模組中只有兩個方法 copy.copy和copy.deepcopy,分別稱之為淺拷貝和深拷貝,以澡堂子為例來解釋。import copy 1.copy.copy a 1,2,3,x y a引用 租賃 使用 這個澡堂子的四個隔間 位址 其中 x y 是乙個包間,適...
python常用模組介紹之二 copy模組
簡介 copy 模組主要用於複製物件,有淺 copy 和深copy 之分。首先得清楚的理解 物件 的概念 物件 python 萬物皆是物件。物件分為可變和不可變 2類,可變物件如 list,dict 等 不可變物件如 基礎型別,元組等。物件有三大特性分別為 身份 id a 型別 type a 值 a...