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

Чем отличается is от ==?

JuniorТипы данных
Ещё спрашивают так:
  • В чём разница между оператором is и ==?
  • Почему None сравнивают через is?
Коротко

== сравнивает значения, is — что это один и тот же объект.

  • == вызывает __eq__, его можно переопределить
  • is сравнивает идентичность, как id(a) == id(b)

А ещё is — для None, True/False и сентинелов; числа и строки через is не сравнивают

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

Подробно

a == b спрашивает объект «равен ли ты другому» — вызывает a.__eq__(b). Класс сам решает, что значит равенство: два разных списка с одинаковыми элементами равны.

a is b проверяет, что оба имени указывают на один объект в памяти. Это сравнение нельзя переопределить, и оно быстрее.

Где использовать is:

  • проверка на None: if x is None — так советует PEP 8. x == None может дать неожиданный результат, если у класса странный __eq__;
  • синглтоны и сентинелы: _missing = object(); if value is _missing.

Ловушка: a = 256; b = 256; a is b даёт True, а для 1000 может дать False. CPython заранее создаёт и переиспользует маленькие целые числа (от −5 до 256) и некоторые строки. Это деталь реализации, на неё нельзя опираться — числа и строки сравнивают через ==.

Пример

a = [1, 2]
b = [1, 2]
c = a
a == b    # True  — одинаковые значения
a is b    # False — разные объекты
a is c    # True  — один объект

x = None
if x is None:
    print("нет значения")

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

  • Чёткое разделение: значение против идентичности объекта.
  • == переопределяется через __eq__, is — нет.
  • is None как правильная идиома.
  • Знание про кэш маленьких чисел как деталь реализации, а не правило.

Частые ошибки

  • Сравнивать строки или числа через is («у меня работало»).
  • Говорить, что is сравнивает «адреса переменных» — сравниваются объекты.

Что спросят дальше

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

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

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

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

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