python refcounts - PullRequest
       12

python refcounts

3 голосов
/ 11 декабря 2010

Итак, Python Essential Reference, 4-е изд. говорит:

a = {}
b = {}
a['b'] = b
b['a'] = a
del a
del b

создает утечку памяти, и интерпретатору необходим алгоритм обнаружения цикла для удаления a и b. Тем не менее, когда я попытался выяснить, каковы показатели отсчета, мне кажется, что в конце отсчеты для a и b обнуляются, поэтому алгоритмы обнаружения циклов не требуются. Как:

a = {}
b = {}

refcounts: a = 1, b = 1

a['b'] = b
b['a'] = a

refcounts: a = 2, b = 2

del a

refcounts: b ['a'] = 1, b = 1

del b

refcounts: a = 0, b = 0

Что не так с моим пониманием refcounts?

Ответы [ 2 ]

4 голосов
/ 11 декабря 2010

del a действительно не уничтожает объект, на который указывает переменная a, он только удаляет переменную a из текущего пространства имен.После этого диктат живет (поскольку другой диктант все еще ссылается на него) и, следовательно, все еще ссылается на второй диктат b.Точно так же, del b не приводит к тому, что счет пересчета первого диктанта достигает нуля, потому что, пока он жив, он ссылается на второй диктат, так что один не может быть удален и поддерживает другой.Извините, это звучит запутанно, я не совсем уверен, как это выразить.

В конце концов, это выглядит так (громоздкие прямоугольники - это объекты, стрелки - ссылки):

+----------+    +----------+
|  dict 1  |    |  dict 2  |
|          | <- |  key 'a' |
|  key 'b' | -> |          |
+----------+    +----------+
3 голосов
/ 11 декабря 2010

В Python уже некоторое время есть циклический gc (начиная с 2.3).Однако можно импортировать модуль gc и настроить циклический gc, включая возможность его отключения.

...