У любого объекта, отслеживаемого в Python GC, нет реферера? - PullRequest
0 голосов
/ 18 марта 2019

Я планировал проверить, есть ли в моем коде 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 Ответ

2 голосов
/ 18 марта 2019

Довольно просто иметь объект, отслеживаемый GC, без ссылок, известных GC. Например,

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

Рефереры не возвращены. GC не знает о ссылках в стеке значений объекта фрейма (за исключением фреймов приостановленных генераторов и сопрограмм), откуда берется ссылка на список [1, 2, 3].

Другие случаи включают объекты, чьи единственные ссылки находятся в глобальных или локальных переменных Си.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...