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
一个对束中的每个对象保持弱引用的对象。我只希望在该组中的一个对象被孤立时进行垃圾收集,即当该组中没有其他对象引用它时。