>>> 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 {}
gc
并在del
foo
后调用gc.collect()
,它消除了弱引用。显然,交互式解释器不会立即收集垃圾。 - Jordan