Идентификатор комплексного числа в Python - PullRequest
1 голос
/ 05 августа 2020
a = 2
b = 2
c = 3.5
d = 3.5
e = 2.3 + 1.5j
f = 2.3 + 1.5j
print('id(a) = ', id(a), 'id(b) = ', id(b))
print('id(c) = ', id(c), 'id(d) = ', id(d))
print('id(e) = ', id(e), 'id(f) = ', id(f))

Программа показывает следующий ответ:

id(a) =  10914528 id(b) =  10914528
id(c) =  140295268467240 id(d) =  140295268467240
id(e) =  140295244785552 id(f) =  140295244784464

Итак, a и b - это два имени для одного и того же целочисленного объекта, а c и d - два имени. для того же объекта с плавающей запятой. Но e и f - это два разных объекта в CPython. Почему?

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Поскольку это неизменяемые объекты, не имеет значения, используется ли один и тот же объект повторно или нет для нескольких вхождений одного и того же значения, и будет ли это использоваться или нет, будет зависеть от реализации.

Фактически CPython всегда использует один и тот же идентификатор для небольших целых чисел (от -5 до 256). Для других жестко запрограммированных констант int / float он будет работать, если оба они определены в одном исходном файле, хотя, если вы попытаетесь импортировать из другого исходного файла, вы обнаружите, что это не тот же объект.

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

Пример:

test1.py

from test2 import a, b
c = 3.5
d = 3.5

print(id(a), id(b), id(c), id(d))

test2.py

a = 3.5
b = 3.5

python test1.py дает:

140082541875392 140082541875392 140082541875800 140082541875800

но если вы измените их на маленькие целые числа (с одинаковым значением), тогда все четыре будут тот же идентификатор.

Обратите внимание, что для жестко запрограммированных констант, введенных с помощью интерактивной оболочки python, он будет аналогичен тому, когда они определены в разных модулях - оптимизация использования одного и того же объекта не используется (кроме маленьких целых чисел):

>>> a = 3.5
>>> b = 3.5
>>> a is b
False
0 голосов
/ 06 августа 2020

Программа, представленная ниже, помогла мне понять, о чем шла речь в этом выпуске.

for i in range(255,259):
   print('i =', i, ', id(i) =', id(i))
print()
a = 255
print('a = ', a, 'id(a) = ', id(a))
b = 256
print('b = ', b, 'id(b) = ', id(b))
c = 257
print('c = ', c, 'id(c) = ', id(c))
d = 258
print('d = ', d, 'id(d) = ', id(d))
e = 257
print('e = ', e, 'id(e) = ', id(e))

Ответ

i = 255 , id(i) = 10922624
i = 256 , id(i) = 10922656
i = 257 , id(i) = 140489683306320
i = 258 , id(i) = 140489683305296

a =  255 id(a) =  10922624
b =  256 id(b) =  10922656
c =  257 id(c) =  140489706959664
d =  258 id(d) =  140489706850896
e =  257 id(e) =  140489706959664

Целое число 255 всегда будет иметь один и тот же идентификатор (это короткий номер). Переменные c и e - это два имени для одного и того же объекта, но для i = 257 существует другая идентификация (257 - не короткое число).

Не существует двух имен для одного и того же комплексного числа . У них всегда разная идентификация (я считаю, что это решение реализации).

Спасибо!

...