[英]Deleting inherited dict elements in python
我有一個對象的字典,該對象將按以下方式銷毀。
class Elem:
def __init__(self, name):
self.name = name
.
.
def __del__(self):
print('destroying elem' + self.name)
class DerivedDict(dict):
def __init__(self):
super(DerivedDict, self).__init__()
def __del__():
for k in self.keys():
del self[k]
elem = Elem('myname')
ddict = DerivedDict()
ddict['myname'] = elem
# this line should delete the both the elem the entry in ddict.
del ddict
當嘗試這個我得到這個錯誤
RuntimeError: dictionary changed size during iteration
您正在使用Python 3.x,並且“ keys”方法為您提供了字典鍵的實時視圖。 當這些更改更改時,由於您刪除了項目,Python無法始終如一地繼續迭代它們。
要解決此問題,只需self.keys
的調用self.keys
給list
構造函數:因此,在迭代之前,您將獲得一個包含現有鍵的快照的列表:
def __del__():
for k in list(self.keys()):
del self[k]
現在,這里有一些技巧可以適當地繼承一個字典,這可能會讓您感到驚訝。 如果您想要的唯一行為是在刪除dict時顯式刪除元素,則根本不需要這樣做-否則,請參閱有關collection.UserDict的文檔-使子類化更加容易,或者請參見collections.abc.MutableSequence-兩者都應保證您需要使用最少的方法集來完成dict行為。
另一個注意事項:在對象超出范圍時,實際上依靠__del__
來運行不是Python的好習慣:可能還有其他引用,它們del self.key[x]
根本不會調用對象上的__del__
方法。 而且在解釋器關閉期間(在程序結尾),即使對於不再正確引用的對象,也無法保證會完全調用__del__
。
您最好添加一個顯式delete
(不是特殊的__del__
)方法並調用它,而不要依賴於del
語句機制。
最好不要在迭代時刪除項目。 實際上,我認為沒有必要重寫__del__
。 只需使用:
class DerivedDict(dict):
def __init__(self):
super(DerivedDict, self).__init__()
這也會導致__del__
Elem
被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.