Что такое сборщик мусора и как он работает в Python
Что проверяют
Знаете ли вы, что в CPython два механизма: подсчёт ссылок и отдельный сборщик циклов. Ответ «есть garbage collector» без деталей засчитывается редко.
Как отвечать
Основной механизм это подсчёт ссылок. У каждого объекта есть счётчик, он растёт при появлении новой ссылки и падает при её исчезновении. Счётчик дошёл до нуля, память освобождается немедленно.
import sys
a = []
sys.getrefcount(a) # на единицу больше ожидаемого: аргумент функции тоже ссылкаПодсчёт ссылок не справляется с циклами: два объекта ссылаются друг на друга, счётчики не нули, но снаружи объекты недостижимы. Для этого есть модуль gc, поколенческий сборщик циклов. Объекты делятся на три поколения, новые проверяются часто, дожившие реже: гипотеза в том, что большинство объектов умирает молодыми. Сборщик находит недостижимые группы и освобождает их.
Полезные детали: gc можно отключить (gc.disable()) там, где циклов заведомо нет и важна задержка, счётчик ссылок при этом продолжает работать. Слабые ссылки через weakref позволяют не удерживать объект. GIL к сборке отношения не имеет, это разные механизмы.
Где спотыкаются
Говорят про сборщик мусора и не упоминают подсчёт ссылок, хотя именно он освобождает почти всё.
Считают, что del удаляет объект. Он удаляет имя, объект уходит, когда исчезает последняя ссылка.
Не знают, что __del__ у объектов в цикле раньше мешал их сборке (до версии 3.4), и не понимают, почему его не рекомендуют.
Путают освобождение объекта и возврат памяти операционной системе: аллокатор Python часто оставляет её себе.