首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><<Fluent python>> P372示例8-19为什么只存在最后一个元素?

<<Fluent python>> P372示例8-19为什么只存在最后一个元素?
EN

Stack Overflow用户
提问于 2019-01-30 16:24:11
回答 2查看 33关注 0票数 2
代码语言:javascript
复制
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()))

结果是:

代码语言:javascript
复制
['block', 'hehe', 'lock', 'red']
['hehe']

问题:为什么结果不是:

代码语言:javascript
复制
['block', 'hehe', 'lock', 'red']
['block', 'hehe', 'lock', 'red']
EN

回答 2

Stack Overflow用户

发布于 2019-01-30 16:30:10

这是因为您使用的是stockweakref.WeakValueDictionary()。从docs

对对象的弱引用不足以保持对象的存活:当对引用对象的唯一剩余引用是弱引用时,垃圾回收可以自由地销毁引用对象并将其内存重用于其他

因此,销毁catalog允许垃圾收集器销毁stock内容。

唯一剩下的元素是最后一个元素,因为它被最后一个循环项引用为cheese

如果执行del cheese,则第二个打印输出完全为空。

票数 4
EN

Stack Overflow用户

发布于 2019-01-30 16:33:04

如果这些值不再被其他任何地方引用,则WeakValueDictionary将处理这些项。

在本例中,所有值都在catalog中引用,另外还有一项作为cheese (上一次迭代的剩余项)。当catalog被删除时,只有一个元素有另一个引用,其他元素都会被释放。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54436110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档