Ответ вслух Middle Типы, изменяемость и сравнение обновлено

is и == в Python: когда что использовать

Вопрос

Объясните разницу между is и == и почему 256 is 256 может быть True, а для больших чисел нет.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «== проверяет равенство значений: Python вызывает eq, и класс решает сам, что считать равным. is проверяет, что слева и справа один и тот же объект, по сути сравнивает id, и переопределить его нельзя. Поэтому is применяют для синглтонов: x is None, проверка уникального объекта-маркера.

Что должно прозвучать в ответе

  • `==` сравнивает значения через `__eq__`, `is` сравнивает идентичность

  • `is` используют для синглтонов: None, sentinel-объекты

  • CPython кеширует целые от -5 до 256 и интернирует часть строк

  • Это деталь реализации, на неё нельзя полагаться

  • `==` можно переопределить, `is` нельзя, поэтому `is None` надёжнее

Что могут спросить следом

  • Что такое интернирование строк и как его включить явно?
  • Может ли x == x быть False?

Разбор

Образцовый ответ: «== проверяет равенство значений: Python вызывает __eq__, и класс решает сам, что считать равным. is проверяет, что слева и справа один и тот же объект, по сути сравнивает id, и переопределить его нельзя. Поэтому is применяют для синглтонов: x is None, проверка уникального объекта-маркера. Для чисел и строк is даёт случайный на вид результат: CPython при старте создаёт объекты для целых от -5 до 256 и раздаёт их повторно, а короткие строки, похожие на идентификаторы, интернирует. Большие числа, созданные в рантайме, будут разными объектами. Всё это детали реализации, поэтому числа и строки сравниваю только через ==, а современный CPython ещё и выдаёт SyntaxWarning на is с литералом. Пример, где x == x ложно: float("nan"), NaN не равен сам себе».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме