Идентичность неизменяемых объектов в PythonPython

Программы на Python
Anonymous
Идентичность неизменяемых объектов в Python

Сообщение Anonymous »

Следующие примеры были выполнены в Python 3.10.13 (в Ubuntu Linux, если это имеет значение).
Я знаю, что некоторые младшие целые числа являются одиночными в Python, а более высокие — нет:

Код: Выделить всё

>>> a = 1
>>> b = 1
>>> a is b
True
>>> a = 1000000
>>> b = 1000000
>>> a is b
False
Все числа с плавающей запятой отличаются друг от друга:

Код: Выделить всё

>>> a = 0.0
>>> b = 0.0
>>> a is b
False
Я предполагал, что каждая строка тоже будет иметь разные идентификаторы, но тогда:

Код: Выделить всё

>>> a = "1024"
>>> b = "1024"
>>> a is b
True
с другой стороны

Код: Выделить всё

>>> a = str(2**10)
>>> b = str(2**10)
>>> a is b
False
Наконец, кортежи, как и числа с плавающей точкой, отличаются друг от друга:

Код: Выделить всё

>>> a = (1,2,3)
>>> b = (1,2,3)
>>> a is b
False
Мои вопросы:
  • Это поведение преднамеренное или это просто следствие реализации, которая считается несущественной?
  • Если это следствие реализации, то почему оно отличается для строк от кортежей, отличается для строк от чисел с плавающей запятой и как оно вообще может зависеть от способа создания строки?
  • Бывают ли случаи, когда мы должны знать об этом поведении, помимо использования == для сравнения неизменяемых объектов? (Я знаю один случай, когда много лет назад я использовал C для ускорения работы с целыми числами, и в итоге я изменил число 1 для всего интерпретатора Python)

Вернуться в «Python»