gpt4 book ai didi

python - 删除python中继承的dict元素

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:27 24 4
gpt4 key购买 nike

我有一个要销毁的对象的字典,如下所示。

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”方法为您提供字典键的实时 View 。当这些发生变化时,由于您删除了项目,Python 无法始终如一地继续迭代它们。

要修复它,只需将对 self.keys 的调用传递给 list 构造函数:因此您会得到一个列表,其中包含迭代前现有键的快照:

def __del__():
for k in list(self.keys()):
del self[k]

现在,这里和那里有一些技巧可以正确地对字典进行子类化,这可能会让您大吃一惊。如果您想要的唯一行为是在 dict 删除时显式删除元素,则根本不需要这样做 - 否则,请参阅有关 collection.UserDict 的文档 - 这使得子类化更容易,或者 collections.abc.MutableSequence - 两者都可以保证您需要覆盖最少的方法集才能完成字典行为。

另一个注意事项:当您的对象超出范围时,依赖 __del__ 实际运行在 Python 中并不被认为是好的做法:可能存在对它们的其他引用,并且它们 del self.key[x] 不会调用对象的__del__ 方法。在解释器关闭期间(在程序结束时),根本无法保证 __del__ 将被调用,即使对于不再正确引用的对象也是如此。

您最好添加一个显式的delete(不是特殊的__del__)方法并调用它,而不是依赖于del 语句机制。

关于python - 删除python中继承的dict元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com