== vs is в Python: в чём разница на собесе

== и is выглядят похоже, но проверяют разные вещи. == сравнивает значения через метод __eq__, is — это один и тот же объект в памяти. На собесе любят спрашивать «почему a is b иногда True для маленьких int».

Если коротко. == — равенство значений, is — идентичность объекта (тот же адрес). Для None всегда используйте is.
Проверь себя · 1/3разбор после ответа
Есть список email emails = ["a@x.com", "b@y.com", "c@x.com"]. Нужно получить множество доменов (часть после @). Какой вариант корректен?

== vs is: таблица различий

Параметр==is
Что сравниваетЗначения (через __eq__)Идентичность (id())
Для NoneРаботает, но не идиоматичноИдиоматично
Перегружается?Да (__eq__)Нет
СкоростьМедленнееБыстрее
PEP8 рекомендуетДля всего остальногоДля None/True/False

Когда использовать ==

Когда использовать is

На примере

== — значения
[1, 2] == [1, 2]   # True (одинаковые значения)
'abc' == 'abc'      # True
None == None         # True (но пишут 'x is None')
is — объекты
[1, 2] is [1, 2]   # False (разные объекты)
a = b = [1]; a is b    # True (одна и та же ссылка)
x is None            # идиоматичная проверка

Ловушка на собесе

Известный «подвох»: 256 is 256 → True, но 257 is 257 → False (зависит от CPython, который кеширует маленькие int от -5 до 256). Никогда не сравнивайте числа через is.
Тренировать Python в Telegram

Ещё сравнения по теме