Как стать автором
Обновить

Комментарии 7

Я правильно понимаю что это вполне годный способ организовывать ссылку на родителя в дочернем объекте который будет дружественный по отношению к сборке мусора?
Т.е. дочерние объекты не будут дуржать своими ссылками на родителя сам родительский объект?

Или нонче сборщик мусора очень умный, такое сам понимает и лучше не лезть в глубину? (имеем в виду что уровней вложения может быть гораздо больше).

Да, это ссылки, которые не держат объекты.

Сборщик мусора не умный и не глупый. Он просто ищет циклы из ссылок и удаляет их. Большая часть объектов удаляется ещё до сборщика, так как в Python есть подсчёт ссылок.

Про сборщик мусора - не совсем. Основной сборщик мусора в CPython (в отличие от PyPy) как раз и основан на подсчёте ссылок, а `gc.collect()`, если не ошибаюсь, должен вызываться вручную. И он не ищет циклы, а наоборот, ищет то, что доступно из верхней области видимости, а остальное удаляет.

В CPython (по умолчанию обычно он подразумевается, конечно) работают оба механизма одновременно:

  • подсчёт ссылок (но я бы не называл это сборщиком мусора, так как тут сборщика как такового нет, объекты и ссылки сами справляются)

  • и собственно сборщик мусора, основанный на поколениях.

Задача сборщика мусора — именно поиск циклических ссылок на объекты. Собственно, было бы странно, если бы он не искал циклы, так как с нециклическими зависимостями и подсчёт может справится.

Сборщик мусора работает автоматически. Управлять частотой вызова сборщика можно задав пороги для каждого поколения с помощью функции gc.set_threshold(...).

gc.collect() принудительно запускает сборщик. Как правило, вручную вызывать эту функцию не стоит, так как сборщик и так вызывается достаточно часто, а ручные вызовы могут только замедлить программу.

Вы имеет ввиду случай, когда в элементе будут ссылки на дочернии и на родительский. В таком случае да, достаточно удобно родительскую ссылку сделать "слабой", чтобы избежать циклических ссылок. Тогда структуру можно будет удалить просто удалив корень. С другой стороны, если этого не делать, когда вся ваша структура будет не доступна из кода, она удалится сборщиком мусора.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории