Подтвердить что ты не робот

Что такое ссылочный цикл в python?

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

4b9b3361

Ответ 1

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

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

a.other = b
b.some_attr = a

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

EDIT: Самый простой ссылочный цикл - это объект, который ссылается на себя:

a = []
a.append(a)

Ответ 2

Это ссылочный цикл:

l = []
l.append(l)

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

Ответ 3

>>> 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

Ответ 4

>>> x=[1,2,3]
>>> x.append(x)
>>> x
[1, 2, 3, [...]]
>>> 

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