オブジェクトの最後の参照を削除しようとすると、奇妙な問題が発生します。
コードは次のとおりです。
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.
または'c' is dead.
(しかし決して'b' is dead.
) のみ、またはこれらのメッセージをまったく受信しませんでした。
だから私の最初の質問は、この奇妙な参照カウントとは何1547
ですか? そして、それはどこから来たのですか?
2 つ目は、インスタンスを殺すと、a
このランダムな「他のインスタンスを殺す」効果が生じるのはなぜですか?