Python GC中跟踪的任何对象都没有引荐来源网址吗?

时间:2019-03-18 06:25:59

标签: python garbage-collection objgraph

我计划验证我的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)]

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

1 个答案:

答案 0 :(得分:2)

拥有一个没有GC引荐来源的GC跟踪对象非常容易。例如,

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

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

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