Выбор ответа Middle Память и производительность обновлено
Циклические ссылки и gc
Вопрос
Два объекта ссылаются друг на друга, и снаружи на них ссылок нет. Что с ними будет в CPython?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Их удалит циклический сборщик gc. У каждого из пары счётчик ссылок не ноль (они держат друг друга), поэтому подсчёт ссылок их не освободит.
Варианты ответа
- Их удалит циклический сборщик
gcправильный ответ - Они будут жить до конца процесса, refcount не ноль
- Они удалятся сразу, как у любых объектов
- Python бросит
MemoryError
Разбор
У каждого из пары счётчик ссылок не ноль (они держат друг друга), поэтому подсчёт ссылок их не освободит. Сборщик поколений периодически находит недостижимые циклы и удаляет их. Если сборщик выключен через gc.disable(), такие циклы действительно накопятся. Для ссылок «назад» на родителя часто используют weakref, чтобы цикла не было вовсе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Память и производительность»
- Встроенные функции против ручного цикла
- Пересечение больших списков id
- Числа Фибоначчи без экспоненты
- Скользящая медиана потока на двух кучах
- Инструменты профилирования Python
- Почему Python медленнее C
- gc.freeze в форкающихся воркерах
- Поколения сборщика мусора