Что такое ссылочный цикл в Python? - PullRequest
22 голосов
/ 28 марта 2012

Я посмотрел в официальной документации для Python, но я не могу найти, что такое ссылочный цикл.Может ли кто-нибудь уточнить, что это для меня, как я пытаюсь понять модуль GC.Заранее благодарю за ваши ответы.

Ответы [ 4 ]

22 голосов
/ 28 марта 2012

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

(Почти) самый простой ссылочный цикл состоит из двух объектов a и b, которые ссылаются друг на друга:

a.other = b
b.some_attr = a

Наивные сборщики мусора работают строго вне зависимости от того, на какой объект ссылается другой объект. В этом случае, если на a и b ничего не ссылается, они все равно ссылаются друг на друга, и наивный сборщик мусора может не освободить память. (Однако я не знаю, может ли Python быть захвачен ссылочными циклами.)

РЕДАКТИРОВАТЬ: простейший ссылочный цикл является объектом, который ссылается на себя:

a = []
a.append(a)
12 голосов
/ 28 марта 2012

Это базовый цикл:

l = []
l.append(l)

Первый элемент l, т.е. l[0], теперь является циклической ссылкой на сам l.

9 голосов
/ 22 января 2013
>>> aRef = []
>>> aRef.append(aRef)
>>> print aRef
[[...]]

Создает объект списка, на который ссылается переменная с именем aRef.first element в объекте списка является ссылкой на себя.В этом случае del aRef разыменование aRef к объекту списка.Однако счетчик ссылок объекта списка не уменьшается до нуля, и объект списка не является сборщиком мусора, поскольку объект списка по-прежнему ссылается на себя.В этом случае сборщик мусора в Python будет периодически проверять, существуют ли такие циклические ссылки, и интерпретатор будет собирать их.Ниже приведен пример для ручного сбора пространства, используемого объектами с круговой ссылкой.

>>> import gc
>>> gc.collect()
0
>>> del aRef
>>> gc.collect()
1
>>> gc.collect()
0
3 голосов
/ 28 марта 2012
>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>> 

Теперь здесь переменная x ссылается на себя, это называется ссылочным циклом.

...