WeakValueDictionary固定参考,没有更多的强引用对象(WeakValueDictio

2019-09-21 08:53发布

>>> 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 {}

Answer 1:

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



Answer 2:

如果你只有一直试图在这一个交互的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>}
#{}


Answer 3:

在Python交互式shell中,你声明的任何变量,是不是垃圾自动收集的,因为在范围__main__还没有结束。 垃圾收集在Python是基于引用计数 ,直到你做明确或下车当前范围,也不会被收集。

在相同的外壳,如果你实现你WeakRef内部功能逻辑,你会看到预期的结果,因为在完成功能,控制失控的范围和对象是由垃圾收集。

这就是为什么例如通过与功能@jdi正显示出你想要的到底是什么。



文章来源: WeakValueDictionary retaining reference to object with no more strong references