Python學習 copy模組

2021-10-02 01:41:52 字數 1702 閱讀 2534

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