Разница между is и ==?
== проверяет равенство значений: объекты считаются равными, если их содержимое совпадает (оператор вызывает метод __eq__). is проверяет тождественность: возвращает True, только если обе переменные указывают на один и тот же объект в памяти. В большинстве случаев используют == для сравнения значений и is — для проверки на None и в редких случаях, когда важна именно идентичность объекта.
Развернутое объяснение
Когда вы пишете:
a == bPython спрашивает у объектов: «Вы представляете одно и то же значение?» — и вызывает под капотом метод __eq__. Поэтому:
два разных списка [1, 2] и [1, 2] равны по значению;
две разные строки "hi" и "hi" равны по содержимому и т.п.
Когда вы пишете:
a is bPython вообще не смотрит на содержимое, он сравнивает адреса объектов: «эти переменные указывают на один и тот же объект в памяти или нет?». Пример:
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.