Сборщик мусора для эталонных циклов

Единственный раз , когда требуется сборщик мусора , если у вас есть ссылочный цикл. Простейшим примером эталонного цикла является тот, в котором A относится к B, а B относится к A, в то время как ничто иное не относится ни к A, ни к B. Ни A, ни B не доступны из любой точки программы, поэтому их можно безопасно уничтожить, все же их счетчики ссылок равны 1, и поэтому они не могут быть освобождены одним алгоритмом подсчета ссылок.

 >>> import gc; gc.disable()  # disable garbage collector
>>> class Track:
        def __init__(self):
            print("Initialized")
        def __del__(self):
            print("Destructed")
>>> A = Track()
Initialized
>>> B = Track()
Initialized
>>> A.other = B
>>> B.other = A
>>> del A; del B  # objects are not destructed due to reference cycle
>>> gc.collect()  # trigger collection
Destructed
Destructed
4 

Референтный цикл может быть произвольно длинным. Если A указывает на B указывает на C указывает на ... указывает на Z, который указывает на A, то ни один от A до Z не будет собираться до фазы сбора мусора:

 >>> objs = [Track() for _ in range(10)]
Initialized
Initialized
Initialized
Initialized
Initialized
Initialized
Initialized
Initialized
Initialized
Initialized
>>> for i in range(len(objs)-1):
...     objs[i].other = objs[i + 1]
...
>>> objs[-1].other = objs[0]  # complete the cycle
>>> del objs                  # no one can refer to objs now - still not destructed
>>> gc.collect()
Destructed
Destructed
Destructed
Destructed
Destructed
Destructed
Destructed
Destructed
Destructed
Destructed
20