Неожиданный результат sys.getrefcount

Не однозначное решение, а лишь некоторые мысли. Мы используем скрипт bash, который приводит к запуску тестов одной командой. В этом скрипте bash мы имеем это:


    # environment variables
    export HOME=${PWD}

    yarn install
    ./node_modules/.bin/cypress install
    ./node_modules/.bin/cypress verify

    ./node_modules/.bin/cypress run ${SMOKETEST}
5
задан Torsten Marek 17 April 2009 в 09:48
поделиться

4 ответа

Из строки документации getrefcount :

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

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

7
ответ дан 18 December 2019 в 06:03
поделиться

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

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

Ссылка на 9802374987193847 соответствует ответу Codeape

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

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

6
ответ дан 18 December 2019 в 06:03
поделиться

Это не 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

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

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

9
ответ дан 18 December 2019 в 06:03
поделиться

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

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

5
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: