第二章 資料結構 copy 複製物件 定製複製行為

2021-09-10 18:17:00 字數 986 閱讀 5749

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 還學習了順序表 單...