> Удалится ли циклическая структура из памяти и когда это происходит в Python? (Python)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Сбер

Стек: Python

> Пример ответа

В Python циклические структуры (например, два объекта, ссылающиеся друг на друга) удаляются из памяти сборщиком мусора (garbage collector, GC), но не мгновенно. Основной механизм - подсчёт ссылок - не справляется с циклами, так как счётчики ссылок никогда не обнуляются. Вместо этого в дело вступает циклический сборщик мусора из модуля gc.

Удаление происходит в несколько этапов:

  1. Периодический запуск GC: Сборщик запускается автоматически, когда разница между количеством созданных и уничтоженных объектов превышает порог (по умолчанию 700 для поколения 0). Также можно вызвать gc.collect() вручную.
  2. Обнаружение циклов: GC обходит объекты, проверяя, есть ли среди них недостижимые из глобального пространства имён (например, не связанные с __main__ или другими корневыми объектами).
  3. Очистка: Если объекты образуют цикл и не имеют внешних ссылок, они помечаются как мусор и удаляются. Для объектов с деструктором __del__ GC обрабатывает их отдельно, помещая в gc.garbage (если не вызван gc.DEBUG_SAVEALL).

Когда именно? - Автоматически при превышении порога аллокаций/деаллокаций, или принудительно. В CPython это происходит асинхронно, не сразу после потери последней внешней ссылки. Поэтому циклические структуры могут висеть в памяти до следующего прохода сборщика.

Пример:

PYTHON
import gc
gc.disable() # отключаем автоматический сбор
a = []
b = []
a.append(b)
b.append(a)
del a, b
# Объекты всё ещё в памяти, так как ссылки цикличны
gc.collect() # теперь они будут удалены

Таким образом, циклическая структура удаляется, когда сборщик мусора обнаруживает её недостижимость, обычно при автоматическом запуске GC или явном вызове gc.collect().

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью