我计划验证我的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)]
尽管模块仍然可以相互引用...这是找到根的正确方法吗?
答案 0 :(得分:2)
拥有一个没有GC引荐来源的GC跟踪对象非常容易。例如,
>>> gc.get_referrers([1, 2, 3])
[]
没有引荐来源返回。 GC不了解帧对象的值堆栈上的引用(挂起的生成器和协程的帧除外),这是对[1, 2, 3]
列表的引用。
其他情况包括仅引用位于C全局或局部变量中的对象。