Check

Работа сборщика мусора и циклические ссылки

Python Senior Яндекс
Как работает сборщик мусора в CPython помимо подсчёта ссылок? Что происходит с циклическими ссылками и какие типы объектов GC не умеет корректно собирать?
Ответы
GC и циклические ссылки
CPython использует подсчёт ссылок + дополнительный поколенческий GC для обнаружения циклов. Когда счётчик ссылок объекта не ноль, но объект больше недостижим (циклы), это обнаруживает GC, обходя граф объектов. Проблема — если в цикле есть объекты с `__del__`, GC не знает, в каком порядке их вызывать, и может пометить их как неосвобождаемые (попадают в `gc.garbage`). Поэтому для сложных графов лучше избегать `__del__` и использовать явные контекстные менеджеры или слабые ссылки (`weakref`).