Что такое ссылочный цикл в Python?
Я посмотрел в официальной документации для Python, но я не могу найти, что такое ссылочный цикл. Может ли кто-нибудь уточнить, что это для меня, как я пытаюсь понять модуль GC. Заранее благодарю за ваши ответы.
4 ответа
Ссылочный цикл просто означает один или несколько объектов, ссылающихся друг на друга, так что если вы нарисовали его на бумаге со стрелками, представляющими зависимости, вы увидите цикл.
(Почти) самый простой ссылочный цикл состоит из двух объектов a
а также b
которые относятся друг к другу:
a.other = b
b.some_attr = a
Наивные сборщики мусора работают строго вне зависимости от того, на какой объект ссылается другой объект. В этом случае, если оба a
а также b
не упоминаются ничем другим, они все еще ссылаются друг на друга, и наивный сборщик мусора может не вернуть память. (Я не знаю, может ли Python быть захвачен ссылочными циклами или нет.)
РЕДАКТИРОВАТЬ: Простейший ссылочный цикл является объектом, который ссылается на себя:
a = []
a.append(a)
Это справочный цикл:
l = []
l.append(l)
Первый элемент l
т.е. l[0]
теперь циклическая ссылка на l
сам.
>>> 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
>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>>
Теперь здесь переменная x
ссылается на себя, это называется эталонный цикл.