У какого-либо объекта, отслеживаемого в Python GC, нет реферера?

#python #garbage-collection #objgraph

#python #сборка мусора #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:

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

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

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

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