is vs == для комплексных чисел в Python
@python_quizРазберем этот квиз
Коротко: код сравнивает два комплексных числа — одно создаётся конструктором, другое задано литералом. Разберём, что вернёт программа и почему.
Код из квиза

Ожидаемый вывод:

Что делает каждая часть
- complex(0, 1) — вызывает конструктор и создаёт новый объект типа complex с действительной частью 0 и мнимой частью 1.
- 1j — литерал комплексного числа, создаваемый во время компиляции и помещаемый в константы кода.
- is — проверяет тождественность объектов (один и тот же объект в памяти).
- == — проверяет равенство по значению (числовое сравнение значений комплексных чисел).
Почему результат такой
- z1 is z2 даёт False, потому что конструктор создал новый объект, а литерал — отдельный объект (или, точнее, другой объект в памяти), следовательно они не тождественны.
- z1 == z2 даёт True, потому что оба объекта представляют одно и то же числовое значение 0+1j, а операторы сравнения по значению для комплексных чисел сравнивают их действительную и мнимую части.
Небольшая демонстрация (id)
Чтобы убедиться, можно посмотреть id объектов:

Вы увидите разные id и результат False True.
Важное замечание о литералах и оптимизациях
В CPython литералы (константы), встречающиеся в одном объекте кода, могут быть переиспользованы компилятором, поэтому два одинаковых литерала в одном блоке кода могут ссылаться на один и тот же объект — и тогда оператор is между ними вернёт True. Но это поведение зависит от реализации и от контекста компиляции. Наоборот, вызов конструктора всегда создаёт новый объект в момент выполнения, поэтому сравнивать объекты по identity (is) для проверки равенства значений — небезопасно и неграмотно.
Правильный стиль — сравнивать числовые значения через == (или math.isclose для плавающих случаев), а is использовать только для проверки на тот самый объект (например, None или синглтоны).
Анализ вариантов ответов (кратко)
- "True True" — противоречит тому, что конструктор создаёт новый объект.
- "False False" — неверно, поскольку значения одинаковы и == вернёт True.
- "False True" — соответствует описанному поведению: разные объекты, равные по значению.
- "True False" — не соответствует логике: unlikely для литерала и результата == одновременно.
Вывод
Для чисел (включая комплексные) проверка на равенство по значению делается через ==. Оператор is проверяет идентичность объекта в памяти и не годится для сравнения значений. В рассматриваемом примере именно поэтому результат будет False True.