Все равенство is
для этих объектов является результатом уловок интерпретатора (которые не являются частью языка spe c AFAIK, но имеют последствия CPython)
Например ( с int
).
Текущая реализация хранит массив целочисленных объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне, вы на самом деле просто вернуть ссылку на существующий объект.
Таким образом, можно изменить значение 1. Я подозреваю, что поведение Python в этом случае не определено. : -)
А для строк python делает interning
. bool
является подклассом int
(issubclass(bool, int)
), который объясняет общие id
для bool
с. AFAIK, числа с плавающей запятой (кроме литералов в 3.8) никогда не возвращают True для is
равенства.
В python3 .8, (1,) is (1,)
это на самом деле True
из-за к изменениям в оценке литералов.
>>> (1,) is (1,)
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
True
Вместе с предупреждением об использовании is
для литералов. Тем не менее, присвоение переменных и выполнение сравнения является ложным (как и ожидалось).
Обратите внимание, что tuple() is tuple()
и frozenset() is frozenset()
оба возвращают True. Однако их изменяемые аналоги (list
и set
) не имеют этого свойства.