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,则第二个打印输出完全为空。

10-08 13:13