WeakValueDictionary保留对对象的引用,没有更强的引用

Jor*_*dan 5 python mapping weak-references python-2.7

>>> 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>}
Run Code Online (Sandbox Code Playgroud)

为什么它显示这个而不是空字典?请注意,此代码生成我期望的结果:

>>> db2 = WeakValueDictionary()
>>> db2['disposable-id'] = Foo()
>>> dict(db2)
{}
Run Code Online (Sandbox Code Playgroud)

执行脚本(而不是交互式解释器)时,它的行为也符合预期:

from weakref import WeakValueDictionary
class Foo(object):
    pass
foo = Foo()
db = WeakValueDictionary()
db['foo-id'] = foo
del foo
print str(dict(foo))
# prints {}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cin 6

WeakValueDictionary不保证在没有正常引用时将删除条目.它保证的是它不会在适当的时候阻止垃圾收集 - 你的对象是垃圾收集,而不是垃圾收集.垃圾收集发生时,该条目将消失.