2.9.3 定製複製行為
可以使用特殊方法__copy__()和__deepcopy__()來控制如何建立副本。呼叫__copy__()而不提供任何引數,這會返回物件的乙個淺副本。呼叫__deepcopy__(),並提供乙個備忘字典,這會返回物件的乙個深副本。所有需要深複製的成員屬性都要連同備忘字典傳遞到copy.deepcopy()以控制遞迴(備忘字典將在後面更詳細地解釋)。
下面這個例子展示了如何呼叫這些方法。
import copy
import functools
@functools.total_ordering
class
myclass
:def
__init__
(self,name)
: self.name = name
def__eq__
(self,other)
:return self.name == other.name
def__gt__
(self,other)
:return self.name > other.name
def__copy__
(self)
:print
('__copy__()'
)return myclass(self.name)
def__deepcopy__
(self,memo)
:print
('__deepcopy__({})'
.format
(memo)
)return myclass(copy.deepcopy(self.name,memo)
)a = myclass(
'a')
sc = copy.copy(a)
dc = copy.deepcopy(a)
備忘字典用於跟蹤已複製的值,以避免無限遞迴。
執行結果:
第二章 資料結構 copy 複製物件 深副本
2.9.2 深副本 deepcopy 建立的深副本是乙個新容器,其中填充了原物件內容的副本。要建立乙個list的深副本,會構造乙個新的list,複製原列表的元素,然後將這些副本追加到新列表。將前例中的copy 呼叫替換為deepcopy 可以清楚地看出輸出的不同。import copy import...
第二章 資料結構 二
知識點 trie樹 並查集,堆的操作 高效地儲存和查詢字串集合的資料結構 const int n 100010 int son n 26 cnt n idx 插入 void insert char str cnt p 以這個點結尾的字元數 查詢 intquery char str return cn...
資料結構 第二章總結
線性表是由n 0 個資料元素組成的有限序列。我們學習了線性表上定義的基本運算 有構造空表 initlist l 求表長 listlength l 取結點 getnode l i 查詢 locatenode l x 插入 insertlist l x,i 刪除 delete l i 還學習了順序表 單...