首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么删除唯一的其他引用后,我的WeakSet不为空?

为什么删除唯一的其他引用后,我的WeakSet不为空?
EN

Stack Overflow用户
提问于 2016-05-25 18:33:41
回答 1查看 209关注 0票数 0

我决定我应该熟悉 library,所以我开始乱搞这些收藏,以为在这之前我已经掌握了它的诀窍。

代码语言:javascript
复制
>>> import weakref

>>> class Greek():
        def __init__(self, name):
            self.name = name

>>> objs = [Greek('alpha'), Greek('gamma'), Greek('zeta')]
>>> weak_s = weakref.WeakSet()

>>> for obj in objs: weak_s.add(obj)

这里我有一个WeakSet weak_s,我希望每个Greek()实例包含3个weakref,并且它包含:

代码语言:javascript
复制
>>>  weak_s.data
{<weakref at 0x02ECA690; to 'Greek' at 0x02E5FF90>,
 <weakref at 0x02ECA720; to 'Greek' at 0x02E5FFB0>,
 <weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}

然后,我希望一旦我去掉了objs名称,就不会再有对每个Greek()实例的“强引用”了,它们将被垃圾收集。但出于某种原因这种事不会发生。

代码语言:javascript
复制
>>> del objs
>>> weak_s.data
{<weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}

为什么我的WeakSet里还有一个弱裁判?我可以再次使用del,它似乎仍然存在,不管我做什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-25 18:38:50

您仍然可以从这里获得obj变量:

代码语言:javascript
复制
>>> for obj in objs: weak_s.add(obj)

该变量保留了循环中的最后一个值,因此它仍然引用最后一个Greek实例,使其处于活动状态,并保存在WeakSet中。

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

https://stackoverflow.com/questions/37445080

复制
相关文章

相似问题

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