Разница между is и ==?

== проверяет равенство значений: объекты считаются равными, если их содержимое совпадает (оператор вызывает метод __eq__). is проверяет тождественность: возвращает True, только если обе переменные указывают на один и тот же объект в памяти. В большинстве случаев используют == для сравнения значений и is — для проверки на None и в редких случаях, когда важна именно идентичность объекта.

Развернутое объяснение

Когда вы пишете:

a == b

Python спрашивает у объектов: «Вы представляете одно и то же значение?» — и вызывает под капотом метод __eq__. Поэтому:

два разных списка [1, 2] и [1, 2] равны по значению;

две разные строки "hi" и "hi" равны по содержимому и т.п.

Когда вы пишете:

a is b

Python вообще не смотрит на содержимое, он сравнивает адреса объектов: «эти переменные указывают на один и тот же объект в памяти или нет?». Пример:

x = [1, 2, 3]
y = [1, 2, 3]
z = x
x == y   # True  (значения совпадают)
x is y   # False (разные объекты)
x is z   # True  (это один и тот же объект)

[x == y → True, x is y → False] — классический пример, который любят приводить на собеседованиях.

Почему is нельзя использовать вместо ==?

Иногда is «случайно» даёт True при сравнении чисел или коротких строк — из‑за кеширования и интернирования объектов в CPython. Это деталь реализации, а не гарантированное поведение. Опасный пример:

a = 256
b = 256
a is b      # часто True, но это не то, на что стоит опираться
a = 257
b = 257
a is b      # может быть False

Поэтому для сравнения чисел, строк, списков, словарей и т.д. всегда используем ==

is применяем только там, где реально важно, один ли это объект, — практически это сводится к проверкам is None и работе с синглтонами.

Когда использовать каждый оператор?

На собеседовании полезно явно сформулировать «правило»: Использовать == когда нужно сравнить значения: числа, строки, структуры данных. Примеры: сравнение идентификаторов, статусов, содержимого коллекций. Использовать is при проверке на None:

if value is None:
   ...

Такой стиль прямо рекомендуется PEP 8 и отраслевыми гайдлайнами. Также is нужен, когда мы заведомо имеем дело с синглтоном (например, объектом‑маркером) и нам важно отличить «тот самый объект» от любых других.

Если сформулировать в одну фразу: == — «равны ли по смыслу», is — «это точно один и тот же объект?».

На курсах TeoBrain мы закрепляем это на практических примерах: от простых сравнений значений до ситуаций, где ошибка выбора между == и is приводит к трудноуловимым багам — именно такие кейсы часто разбирают на собеседованиях уровня Junior.

Назад к списку