【发布时间】:2009-03-24 15:39:59
【问题描述】:
我需要一个弱引用列表,以便在项目死亡时删除它们。目前我这样做的唯一方法是继续刷新列表(手动删除死引用)。
我知道有 WeakKeyDictionary 和 WeakValueDictionary,但我真的很喜欢 WeakList,有没有办法做到这一点?
这是一个例子:
import weakref
class A(object):
def __init__(self):
pass
class B(object):
def __init__(self):
self._references = []
def addReference(self, obj):
self._references.append(weakref.ref(obj))
def flush(self):
toRemove = []
for ref in self._references:
if ref() is None:
toRemove.append(ref)
for item in toRemove:
self._references.remove(item)
b = B()
a1 = A()
b.addReference(a1)
a2 = A()
b.addReference(a2)
del a1
b.flush()
del a2
b.flush()
【问题讨论】:
-
您能否定义“die”、“reference”、“flush”、“手动删除”?没有这些,这个问题真的没有多大意义。
-
die = 弱引用变得无效(“死”)。参考 = 弱参考 (docs.python.org/library/weakref.html)。 flush = 手动删除 = 遍历列表中的所有引用,删除那些无效的。
-
如果您改用普通列表,则无需刷新任何内容...您的示例似乎很做作。你的实际观点是什么?
-
是的,这是人为的。我试图创建一个简单的例子来说明,实际的解决方案比这复杂得多。我所追求的只是一个包含弱引用的列表,这些引用将在解除分配时自动删除。如果不存在,我将创建自己的来执行此操作。
-
普通对象在没有引用时自动删除。没有什么“额外”需要做的。请提供一些您正在尝试做的不适合普通垃圾收集的感觉。