Это не 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 (среди прочих). Поскольку маленькие целые числа создаются очень часто, их совместное использование экономит много памяти. Это стало возможным благодаря тому факту, что целые числа являются неизменными в первую очередь.
Для дополнительной ссылки во втором примере, см. ответ кодеапе .