is проверяет идентичность, а не числовое равенство. В CPython малые целые обычно переиспользуются, но поведение за пределами кеша зависит ещё и от компиляции констант; правило «257 всегда разные» неверно.
Разбор поведения оператора is при сравнении целых в Python
is проверяет идентичность, а не числовое равенство. В CPython малые целые обычно переиспользуются, но поведение за пределами кеша зависит ещё и от компиляции констант; правило «257 всегда разные» неверно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Объясните, почему при выполнении следующего кода в интерактивной оболочке Python получаются такие результаты. Обратите внимание на то, как Python кэширует небольшие целые числа и как это влияет на проверку идентичности объектов с помощью оператора is.
>>> x = 256
>>> y = 256
>>> x is y
True
>>> x = 257
>>> y = 257
>>> x is y
False
- При значениях от -5 до 256 Python использует внутренний кэш небольших целых чисел, поэтому переменные, получившие одинаковое значение из этого диапазона, указывают на один и тот же объект в памяти – проверка
isвозвращаетTrue. - Для чисел, выходящих за пределы кэшируемого диапазона (например, 257), каждый оператор присваивания создаёт новый объект. Поэтому две переменные с одинаковым значением, но за пределами кэша, ссылаются на разные объекты, и
isвозвращаетFalse. - Оператор
isпроверяет идентичность объектов, а не их равенство. Для сравнения значений следует использовать==. - Практический вывод: не полагайтесь на
isдля сравнения чисел; используйте==, если важна только эквивалентность значений, аisоставляйте для проверок наNoneили сравнения с единственными объектами.
Ответ
is проверяет идентичность, а не числовое равенство. В CPython малые целые обычно переиспользуются, но поведение за пределами кеша зависит ещё и от компиляции констант; правило «257 всегда разные» неверно.
При отдельных командах интерактивной оболочки показанный результат типичен для CPython: 256 берётся из кеша, а два 257 могут быть разными объектами. В одном скомпилированном блоке одинаковая константа 257 может переиспользоваться, и is даст True.
Диапазон кеширования относится к реализации, не к обязательному контракту языка. Программа должна сравнивать числа через ==, а is оставлять для идентичности объектов, например x is None. Одинаковые значения x и y не требуют одинакового адреса в памяти.