0

我计划验证我的 Python 3.6 代码是否有任何循环引用。

给定一个对象,get_referrers https://docs.python.org/3/library/gc.html#gc.get_referrers返回引用该对象的所有对象。但是,以下返回 []

[o for o in gc.get_objects() if not bool(gc.get_referrers(o))]

这意味着所有对象都至少有一个引用者。

我还发现https://mg.pov.lt/objgraph/objgraph.html#objgraph.is_proper_module使用模块作为根。

[o for o in gc.get_objects() if objgraph.is_proper_module(o)]

虽然模块仍然可以相互引用......这是找到根的正确方法吗?

4

1 回答 1

2

拥有一个没有 GC 已知的引用者的 GC 跟踪对象非常容易。例如,

>>> gc.get_referrers([1, 2, 3])
[]

没有推荐人返回。GC 不知道框架对象的值堆栈上的引用(挂起的生成器和协程的框架除外),这是对[1, 2, 3]列表的引用的来源。

其他情况包括仅引用存在于 C 全局或局部变量中的对象。

于 2019-03-18T06:33:56.197 回答