Python内置的weakref模块即弱引用模块,这个模块的神奇之处在于可以调用对象,但是不会增加其引用计数,当引用计数为0时,对象仍然会被回收,弱引用也无法继续调用对象。这么做的好处在于,不用担心对象事实上没有被用了但是因为保存的一次引用导致其占用的内存无法释放。
其中的WeakKeyDictionary当键的唯一一次引用是在该字典中时就释放其内存,同时在字典中删除。
我们知道普通字典的键即使外部没有任何引用,也会在字典中保存一份:
class Test:
pass
tt = Test()
adict = {}
adict[tt] = 'test_value'
del tt
print(dict(adict))
输出:
{<__main__.Test object at 0x000002C4E1D51C40>: 'test_value'}
如果把adict改为WeakKeyDictionary:
import weakref
class Test:
pass
tt = Test()
adict = weakref.WeakKeyDictionary()
adict[tt] = 'test_value'
del tt
print(dict(adict))
输出:
{}
如果adict外部没有对象再引用它的键时,它的该键就会被自动删除,同时释放其内存。