Почему циклы ссылок в Python не позволяют счетчику перейти в 0? - PullRequest
1 голос
/ 30 апреля 2020

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

class MyClass(object):
     pass

 a = MyClass()
 a.obj = a

Если бы мне пришлось тогда вызывать del a, я бы, вероятно, не имел бы избавился от всех ссылок на a, поскольку самореферентная природа a должна препятствовать тому, чтобы он имел ненулевой счетчик ссылок.

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

1 Ответ

5 голосов
/ 30 апреля 2020
class MyClass(object):
     pass

a = MyClass()
# for clarity, let's call this object "trinket"
# (to dissociate the object from the variable)
# one reference to trinket: variable a

a.obj = a
# two references to trinket: variable a, trinket.obj

del a
# one reference to trinket: trinket.obj
# (because del doesn't delete the object, just the variable)

Таким образом, сборщик мусора с подсчетом ссылок не может утилизировать эту безделушку. К счастью, Python имеет другой сборщик мусора, сборщик мусора поколений (если вы не отключите его, используя gc.disable()). Он запускается периодически, и когда он запускается, он избавится от нашей безделушки, несмотря на то, что остается висячая ссылка.

...