0

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

代码是:

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

输出是这样的:

reference count before killed: 2
'a' is dead.
reference count after killed: 1547
'd' is dead.
'c' is dead.

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

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

第二个是:为什么杀死实例a会产生这种随机的“杀死其他实例”效果?

4

1 回答 1

2

aGC 之后,d.ref[0]()产生None. 这就是为什么您在删除后得到 1547 的引用计数a;毕竟,您不能要求收集对象的引用计数,对吗?

c和的奇怪删除d是因为 Python 不保证解释器退出时对象是否活着会经历正常的销毁过程。b, c, 并且d在你的脚本结束时都还活着。有时,它们会正常进行 GC,并且会运行弱引用回调。有时,这不会发生。Python 在这里不做任何承诺。

于 2013-09-17T01:20:16.303 回答