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']
最佳答案
那是因为你用weakref.WeakValueDictionary()
表示stock
。从docs开始:
对一个对象的弱引用不足以使该对象保持活动状态:当对一个引用的剩余引用是弱引用时,垃圾收集可以自由地销毁该引用并将其内存用于其他用途。
因此销毁catalog
允许垃圾收集器销毁stock
内容。
只有剩下的元素是最后一个元素,因为它被最后一个循环项引用为cheese
如果执行del cheese
,则第二个打印输出完全为空。