import weakref
import gc
class MyClass(object):
def refer_to(self, thing):
self.refers_to = thing
foo = MyClass()
bar = MyClass()
foo.refer_to(bar)
bar.refer_to(foo)
foo_ref = weakref.ref(foo)
bar_ref = weakref.ref(bar)
del foo
del bar
gc.collect()
print foo_ref()
foo_ref
とへのbar_ref
弱い参照を保持したいのですが、それらが相互に参照している限り、それぞれfoo
*ですが、代わりに。を出力します。ガベージコレクターが参照サイクル内に特定のオブジェクトを収集しないようにするにはどうすればよいですか?bar
None
bar
foo
-bar
参照サイクルの一部ではなくなったため、このコードではガベージコレクションする必要があります。
baz = MyClass()
baz.refer_to(foo)
foo.refer_to(baz)
gc.collect()
*循環参照がガベージコレクションされるのを防ぐのは無意味に思えるかもしれませんが、私のユースケースではそれが必要です。WebのようWeakValueDictionary
に相互に参照するオブジェクトの束と、束内の各オブジェクトへの弱参照を保持するオブジェクトがあります。孤立している場合、つまり、バンチ内の他のオブジェクトがそのオブジェクトを参照していない場合にのみ、バンチ内のオブジェクトをガベージコレクションする必要があります。