Разбор поведения оператора is при сравнении целых в Python

is проверяет идентичность, а не числовое равенство. В CPython малые целые обычно переиспользуются, но поведение за пределами кеша зависит ещё и от компиляции констант; правило «257 всегда разные» неверно.

Короткий ответ

Что ответить на собеседовании

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 не требуют одинакового адреса в памяти.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее