Получить доступ

Почему a is b для чисел и строк иногда True, а иногда False?

MiddleВнутреннее устройство
Ещё спрашивают так:
  • Что такое кэш малых целых и интернирование строк в Python?
Коротко

CPython заранее создаёт целые от −5 до 256 и переиспользует их — is для них True. Строки, похожие на идентификаторы, и константы в одном блоке кода интернируются компилятором. Всё это детали реализации: значения сравнивают через ==, а is — только с None и синглтонами.

  • a = 257; b = 257 в интерактивной оболочке — разные объекты, в одном файле — может быть один (свёртка констант)
  • sys.intern(s) — интернировать строку явно (ускоряет сравнение ключей)
  • Python 3.8+ предупреждает: SyntaxWarning "is" with a literal

А ещё Аналог в Java — кэш Integer от −128 до 127

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Кэш малых целых. При старте CPython создаёт объекты для чисел от −5 до 256. Любое вычисление с таким результатом возвращает готовый объект, поэтому a = 100; b = 100; a is b — True.

Почему 257 ведёт себя по-разному. В интерактивной оболочке каждая строка компилируется отдельно — два разных объекта, is даёт False. В файле обе константы попадают в один блок кода, компилятор объединяет одинаковые константы — is может дать True. Результат зависит от способа запуска и версии.

Интернирование строк. Строковые литералы, похожие на идентификаторы (буквы, цифры, подчёркивание), интернируются автоматически: имена атрибутов и ключи словарей сравниваются по адресу быстрее. sys.intern() делает это явно — полезно, когда миллионы одинаковых строк (теги, коды) занимают память.

Правило: is проверяет идентичность объекта и уместен только для None, True/False, Ellipsis и собственных маркеров-синглтонов. Значения сравнивают через ==.

Что хотят услышать

  • Кэш малых целых и интернирование строк.
  • Почему результат зависит от контекста.
  • Правило: is только для None и синглтонов.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем