id
действительно однозначно идентифицирует живые объекты (как в: если id(a) == id(b)
, то a is b == True
и если id(a) != id(b)
, a is b == False
). Поведение, которое вы видите (несвязанные «экземпляры» 11
на самом деле являются одним и тем же объектом) происходит из деталей реализации CPython.
В CPython литерал 11
всегда будет возвращать один и тот же объект, поскольку есть встроенный кэш для чисел от -5 до 256 . Попробуйте свой код с 257, и вы увидите, что каждый раз вы будете получать разные id
s - если вы не напишите их в одном выражении, поскольку в этом случае есть оптимизация, которая предоставит вам один и тот же объект.
Тем не менее, это показывает, что исследование идентичности неизменяемых объектов в значительной степени бессмысленно - два неизменных объекта с одним и тем же значением могут на самом деле или не могут быть одним и тем же объектом, в зависимости от кэшей / оптимизаций, и вам просто не следует заботиться об этом. ваш код. Для неизменных объектов все, что вам нужно, это их ценность.