Чтобы ответить на ваш вопрос:
Почему контрольные циклы не позволяют счету перейти в 0?
Ссылка
Вещи, которые увеличивают число ссылок, включают:
- оператор присваивания
- передача аргумента
- добавление объекта в список
Рассмотрим следующий код:
lst = [] # assignment => (ref count + 1) for related object
lst.append(lst) # append to list => (ref count + 1) for related object
После двух вышеперечисленных шагов -> счетчик ссылок = 2 (+1 за каждый шаг)
Однако, это создало цикл ссылок.
del lst # decreases reference count by 1
Теперь счетчик ссылок = 1.
Но переменные не ссылаются на этот объект, поэтому счетчик ссылок не изменится.
И обычная сборка мусора не удалит его Так как ref count> 0.
Так что при обычной сборке мусора это приводит к так называемой «утечке памяти» (то есть памяти, на которую не ссылаются, но которую нельзя освободить).