>>> from weakref import WeakValueDictionary
>>> class Foo(object):
... pass
>>> foo = Foo()
>>> db = WeakValueDictionary()
>>> db['foo-id'] = foo
>>> del foo
>>> dict(db)
{'foo-id': <__main__.Foo object at 0x4dd946c>}
它为什么会显示这个,而不是一个空的字典吗? 请注意,此代码产生我所期待的结果:
>>> db2 = WeakValueDictionary()
>>> db2['disposable-id'] = Foo()
>>> dict(db2)
{}
这也表现在执行一个脚本(而不是交互解释)时,按预期:
from weakref import WeakValueDictionary
class Foo(object):
pass
foo = Foo()
db = WeakValueDictionary()
db['foo-id'] = foo
del foo
print str(dict(foo))
# prints {}
WeakValueDictionary
并不能保证在没有正常引用项将被删除。 它所保证的是,它不会阻止垃圾收集在适当的时候-你的对象是垃圾收集的 ,而不是垃圾收集 。 当垃圾收集发生的条目将消失。
如果你只有一直试图在这一个交互的shell,我相信这与垃圾收集的是,接口和全球范围内的操作下工作的方式做。
从脚本试试这个:
foo.py
from weakref import WeakValueDictionary
class Foo(object):
pass
f = Foo()
d = WeakValueDictionary()
d['f'] = f
print dict(d)
del f
print dict(d)
接着...
$ python foo.py
{'f': <__main__.Foo object at 0x101f496d0>}
{}
现在,从交互式Python外壳试试这个,下功能范围移动操作:
from weakref import WeakValueDictionary
class Foo(object):
pass
f = Foo()
d = WeakValueDictionary()
d['f'] = f
def main():
global f
print dict(d)
del f
print dict(d)
main()
#{'f': <__main__.Foo object at 0x100479f10>}
#{}
在Python交互式shell中,你声明的任何变量,是不是垃圾自动收集的,因为在范围__main__
还没有结束。 垃圾收集在Python是基于引用计数 ,直到你做明确或下车当前范围,也不会被收集。
在相同的外壳,如果你实现你WeakRef
内部功能逻辑,你会看到预期的结果,因为在完成功能,控制失控的范围和对象是由垃圾收集。
这就是为什么例如通过与功能@jdi正显示出你想要的到底是什么。
文章来源: WeakValueDictionary retaining reference to object with no more strong references