2009-04-17 3 views

ответ

6

От getrefcount docstring:

... Граф вернулся, как правило, один выше, чем можно было бы ожидать, , поскольку она включает в себя (временное) ссылку в качестве аргумента getrefcount().

Другие две ссылки означают, что python внутренне держит две ссылки на объект. Может быть, словаря locals() и globals() считаются одной ссылкой?

+0

Благодарим вас за подходящее решение – user46646

+0

, поэтому, когда я делаю «del astrd», его счетчик ссылок становится 0 и собирается gc? – user46646

6

Я думаю, что он считает ссылки на 123, попробуйте другие примеры, как

>>> import sys 
>>> astrd = 1 
>>> sys.getrefcount(astrd) 
177 
>>> astrd = 9802374987193847 
>>> sys.getrefcount(astrd) 
2 
>>> 

RefCount для 9802374987193847 подходит ответ codeape в.

Это, вероятно, потому, что числа являются непреложными. Если вы, например, используете список, он всегда будет 2 (из чистого приглашения).

Btw, я получаю 2 для 123, а возможно, ваша настройка несколько отличается? Или это может быть связано со временем?

+0

Благодарим вас за подходящее решение – user46646

5

Интс осуществляются особым образом, они кэшируются и совместно, что, почему вы не получаете 1.

И питон, использует подсчет ссылок объектов. astrd сам по себе является ссылкой, поэтому вы фактически получаете количество ссылок на int '123'. Попробуйте с другим (определяемым пользователем) типом, и вы получите 1.

+0

Благодарим вас за подходящее решение – user46646

7

Это не astrd, на который ссылаются три раза, но значение 123. astrd - это просто имя (неизменяемое) число 123, на которое можно ссылаться много раз. Кроме того к этому, небольшие целые числа, как правило, разделяют:

>>> astrd = 123 
>>> sys.getrefcount(astrd) 
4 
>>> j = 123 
>>> sys.getrefcount(astrd) 
5 

Во втором задании, не новое целое не создается, а j это просто новое название для целого 123.

Однако, учитывая очень большие целые числа, это не имеет места:

>>> i = 823423442583 
>>> sys.getrefcount(i) 
2 
>>> j = 823423442583 
>>> sys.getrefcount(i) 
2 

Shared целых числа являются деталью реализации CPython (среди прочих). Поскольку маленькие целые числа создаются очень часто, их совместное использование экономит много памяти. Это стало возможным благодаря тому, что целые числа являются неизменными в первую очередь.

Для дополнительной ссылки во втором примере см. codeape's answer.

+0

благодарим вас за подходящее решение – user46646

 Смежные вопросы

  • Нет связанных вопросов^_^