Выбор ответа Middle Память и производительность обновлено

Циклические ссылки и gc

Вопрос

Два объекта ссылаются друг на друга, и снаружи на них ссылок нет. Что с ними будет в CPython?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Их удалит циклический сборщик gc. У каждого из пары счётчик ссылок не ноль (они держат друг друга), поэтому подсчёт ссылок их не освободит.

Варианты ответа

  1. Их удалит циклический сборщик gcправильный ответ
  2. Они будут жить до конца процесса, refcount не ноль
  3. Они удалятся сразу, как у любых объектов
  4. Python бросит MemoryError

Разбор

У каждого из пары счётчик ссылок не ноль (они держат друг друга), поэтому подсчёт ссылок их не освободит. Сборщик поколений периодически находит недостижимые циклы и удаляет их. Если сборщик выключен через gc.disable(), такие циклы действительно накопятся. Для ссылок «назад» на родителя часто используют weakref, чтобы цикла не было вовсе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.