Чем отличается is от ==?
- В чём разница между оператором is и ==?
- Почему None сравнивают через is?
== сравнивает значения, is — что это один и тот же объект.
==вызывает__eq__, его можно переопределитьisсравнивает идентичность, какid(a) == id(b)
А ещё is — для None, True/False и сентинелов; числа и строки через is не сравнивают
Подробно
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сравнивает «адреса переменных» — сравниваются объекты.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗is сравнивает значения через __eq__, а == — идентичность объектов
- ✗Числа и строки правильно сравнивать через is
- ✗Проверку на None правильно писать как x == None
- ✓== сравнивает значения через __eq__, is — что это один и тот же объект
Что спросят дальше
Разбор темы
- Типы и коллекции — что изменяемо, что хешируемо и как устроен dict
Изменяемые и неизменяемые типы, список и кортеж, словарь и множество на хеш-таблице, is против ==, модуль collections.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.