首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除上次引用后的奇怪删除行为

删除上次引用后的奇怪删除行为
EN

Stack Overflow用户
提问于 2013-09-17 01:05:13
回答 1查看 35关注 0票数 0

在试图删除对象的最后引用时,我遇到了一个奇怪的问题。

守则是:

代码语言:javascript
运行
复制
import sys
import weakref

class Ref:

    def __init__(self, name):
        self.name = name
        self.ref = []

    def reference(self, obj):
        name = obj.name
        self.ref.append(
            weakref.ref(obj, lambda wref: print('{!r} is dead.'.format(name))))


a = Ref('a')
b = Ref('b')
c = Ref('c')
d = Ref('d')

a.reference(b)
b.reference(c)
c.reference(d)
d.reference(a)

print('reference count before killed:', sys.getrefcount(d.ref[0]()))
del a
print('reference count after killed:', sys.getrefcount(d.ref[0]()))

输出如下:

代码语言:javascript
运行
复制
reference count before killed: 2
'a' is dead.
reference count after killed: 1547
'd' is dead.
'c' is dead.

但有时(完全是随机的)我只收到了'd' is dead.'c' is dead. (但从来没有收到'b' is dead.),或者完全没有这些消息。

所以我的第一个问题是:这个奇怪的参考计数1547是什么?它是从哪里来的?

第二个问题是:为什么杀死实例a创建这个随机的“杀死其他实例”效应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-17 01:20:16

a被GC化之后,d.ref[0]()会生成None。这就是为什么在删除a之后,你得到了1547的重新计数;毕竟,你不能要求一个收集的物体的重新计数,对吗?

删除cd的奇怪之处在于,它不能保证解释器退出时对象是否还活着,将经历正常的销毁过程。bcd在脚本的末尾都是活动的。有时,他们会得到GC正常,弱的回调将运行。有时候,这是不可能的。Python在这里不做任何承诺。

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

https://stackoverflow.com/questions/18839727

复制
相关文章

相似问题

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