> Удалится ли циклическая структура из памяти и когда это происходит в Python? (Python)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Сбер
Стек: Python
> Пример ответа
В Python циклические структуры (например, два объекта, ссылающиеся друг на друга) удаляются из памяти сборщиком мусора (garbage collector, GC), но не мгновенно. Основной механизм - подсчёт ссылок - не справляется с циклами, так как счётчики ссылок никогда не обнуляются. Вместо этого в дело вступает циклический сборщик мусора из модуля gc.
Удаление происходит в несколько этапов:
- Периодический запуск GC: Сборщик запускается автоматически, когда разница между количеством созданных и уничтоженных объектов превышает порог (по умолчанию 700 для поколения 0). Также можно вызвать
gc.collect()вручную. - Обнаружение циклов: GC обходит объекты, проверяя, есть ли среди них недостижимые из глобального пространства имён (например, не связанные с
__main__или другими корневыми объектами). - Очистка: Если объекты образуют цикл и не имеют внешних ссылок, они помечаются как мусор и удаляются. Для объектов с деструктором
__del__GC обрабатывает их отдельно, помещая вgc.garbage(если не вызванgc.DEBUG_SAVEALL).
Когда именно? - Автоматически при превышении порога аллокаций/деаллокаций, или принудительно. В CPython это происходит асинхронно, не сразу после потери последней внешней ссылки. Поэтому циклические структуры могут висеть в памяти до следующего прохода сборщика.
Пример:
PYTHONimport gcgc.disable() # отключаем автоматический сборa = []b = []a.append(b)b.append(a)del a, b# Объекты всё ещё в памяти, так как ссылки цикличныgc.collect() # теперь они будут удалены
Таким образом, циклическая структура удаляется, когда сборщик мусора обнаруживает её недостижимость, обычно при автоматическом запуске GC или явном вызове gc.collect().
> Похожие задачи по backend
Что такое range в Python и как он используется в качестве аргумента?
Какова временная сложность добавления элемента в список Python в конец, начало и середину
Что такое итераторы и генераторы в Python и в чем их разница
Какие минусы могут быть от использования индексов
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью