import weakref
class Cheese:
def __init__(self,kind):
self.kind = kind
def __repr__(self):
return "cheese {}".format(self.kind)
stock = weakref.WeakValueDictionary()
catalog = [Cheese("red"),Cheese("block"),Cheese("lock"),Cheese("hehe")]
for cheese in catalog:
stock[cheese.kind] = cheese
print(sorted(stock.keys()))
del catalog
print(sorted(stock.keys()))结果是:
['block', 'hehe', 'lock', 'red']
['hehe']问题:为什么结果不是:
['block', 'hehe', 'lock', 'red']
['block', 'hehe', 'lock', 'red']发布于 2019-01-30 16:30:10
这是因为您使用的是stock的weakref.WeakValueDictionary()。从docs
对对象的弱引用不足以保持对象的存活:当对引用对象的唯一剩余引用是弱引用时,垃圾回收可以自由地销毁引用对象并将其内存重用于其他。
因此,销毁catalog允许垃圾收集器销毁stock内容。
唯一剩下的元素是最后一个元素,因为它被最后一个循环项引用为cheese
如果执行del cheese,则第二个打印输出完全为空。
发布于 2019-01-30 16:33:04
如果这些值不再被其他任何地方引用,则WeakValueDictionary将处理这些项。
在本例中,所有值都在catalog中引用,另外还有一项作为cheese (上一次迭代的剩余项)。当catalog被删除时,只有一个元素有另一个引用,其他元素都会被释放。
https://stackoverflow.com/questions/54436110
复制相似问题