При каких условиях ссылка считается в Python приращением / уменьшением? - PullRequest
0 голосов
/ 30 апреля 2020

Я знаю, что в Python сборка мусора для объекта запускается, когда счетчик ссылок объекта достигает 0.

https://docs.python.org/3.8/c-api/intro.html#objects -типы-и-ссылки -counts

Но я изо всех сил пытаюсь понять, какие именно условия вызывают увеличение / уменьшение счетчика ссылок.

В частности,

( 1) Я знаю, что счетчик увеличивается для каждой ссылки на объект ... но я не знаю точно, что подразумевается под ссылкой в контексте Python. Я изо всех сил пытаюсь понять, как ссылки отличаются, скажем, от имен или переменных. Что такое ссылка в Python? (примеры особенно ценятся)

и

(2) Каковы условия, которые вызывают уменьшение счетчика ссылок?

1 Ответ

2 голосов
/ 30 апреля 2020

Чтобы ответить на ваш вопрос:

Почему контрольные циклы не позволяют счету перейти в 0?

Ссылка

Вещи, которые увеличивают число ссылок, включают:

  1. оператор присваивания
  2. передача аргумента
  3. добавление объекта в список

Рассмотрим следующий код:

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.

Так что при обычной сборке мусора это приводит к так называемой «утечке памяти» (то есть памяти, на которую не ссылаются, но которую нельзя освободить).

...