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

2024-05-15 23:48:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我决定我应该熟悉^{} library,所以我开始乱搞收藏,以为在这之前我已经掌握了窍门。你知道吗

>>> 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)

这里我有一个弱集weak_s,我希望每个Greek()实例包含3个weakref,它确实:

>>>  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()实例的“强引用”,它们将被垃圾收集。但出于某种原因,这并没有发生。你知道吗

>>> del objs
>>> weak_s.data
{<weakref at 0x02ECA750; to 'Greek' at 0x02E5FFD0>}

为什么我的WeakSet里还有一个weakref?我可以再次使用del,而且它仍然存在,似乎不管我做什么。你知道吗


Tags: to实例nameselfobjdatalibraryat
1条回答
网友
1楼 · 发布于 2024-05-15 23:48:38

这里还有obj变量:

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

该变量保留了它在循环中的最后一个值,因此它仍然引用最后一个Greek实例,使它保持活动状态并在WeakSet中。你知道吗

相关问题 更多 >