程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python自定義對象實現深拷貝 copy.deepcopy

編輯:Python

當有自定義的class繼承了dict時,在使用copy.deepcopy便需要重寫__deepcopy__方法,這個方法一不小心就會寫成shallow copy(只copy了最外層) 或是寫出死循環,如下反例:

 def __deepcopy__(self, memo=None, _nil=[]):
dict = _MyDict()
for key in self.keys():
dict.__setattr__(key,self.__getattr__(key))

注意到參數中實際上有一個memodict,是可以用來避免死循環的,字典copy的主要過程首先是這樣:

for key in self.keys():
dict .__setattr__(deepcopy(key, memo),
deepcopy(self.__getattr__(key), memo))

key和value都需要調用各自的deepcopy方法,之後在函數入口處應當首先判斷當前對象是否在memo中出現過(這裡寫法參照deepcopy函數源碼),即,是否是遞歸的循環調用, 如果沒有,需要將自己的id加到字典中,表明自己正在進行deep copy:

 def __deepcopy__(self, memo=None, _nil=[]):
dict = _MyDict()
for key in self.keys():
dict.__setattr__(key,self.__getattr__(key))

整體代碼如下:

class _MyDict(dict):
....
def __deepcopy__(self, memo=None, _nil=[]):
if memo is None:
memo = {
}
d = id(self)
y = memo.get(d, _nil)
if y is not _nil:
return y
dict = _MyDict()
memo[d] = id(dict)
for key in self.keys():
dict .__setattr__(deepcopy(key, memo),
deepcopy(self.__getattr__(key), memo))
return dict

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved