is и == в Python легко перепутать, но они отвечают на разные вопросы. == спрашивает «равны ли значения?», а is — «это один и тот же объект в памяти?». Два разных списка с одинаковым содержимым равны по ==, но не идентичны по is. Разберём, когда какой оператор нужен и почему is для чисел обманчив.
Коротко
== сравнивает значения — используй его почти всегда. is сравнивает идентичность объекта (тот ли это самый объект) — используй только для проверки на None: if x is None. Для сравнения чисел, строк и списков is применять нельзя — результат непредсказуем.
Разница на примере
x = [1, 2, 3]
y = [1, 2, 3]
print(x == y) # равны ли значения?
print(x is y) # один ли это объект?True False
x и y содержат одинаковые данные, поэтому x == y — True. Но это два разных списка, созданных отдельно: каждый занимает своё место в памяти. Поэтому x is y — False. Оператор == смотрит на содержимое, is — на «это физически тот же объект или нет».
Когда две переменные ссылаются на один объект, is вернёт True:
x = [1, 2, 3]
z = x # та же ссылка, не копия
print(x == z)
print(x is z)True True
Здесь z = x не создаёт новый список, а даёт второе имя тому же объекту. Поэтому и значения равны, и объект один и тот же. Как устроены объекты, значения и типы — в гайде Типы данных в Python: полный гайд для начинающих.
Единственный частый случай для is — это None
None в программе существует в единственном экземпляре, поэтому проверку на него принято писать через is — это быстро и однозначно. Так же поступают с True и False, но на практике чаще всего встречается именно is None.
def find_user(user_id):
return None
result = find_user(42)
if result is None:
print("Пользователь не найден")Пользователь не найден
Здесь is None — идиоматичная проверка «результата нет». А вот сравнивать значения (result == "admin", age == 18) всегда нужно через ==. Про сами операторы сравнения и условия — в гайде if, elif и else в Python: условия с примерами.
Короткие ответы на вопросы
В чём разница is и ==?
== сравнивает значения (равны ли данные), is — идентичность (один ли это объект в памяти). Два разных списка с одинаковым содержимым: == даст True, is — False.
Когда использовать is?
Практически только для None: if x is None. Для сравнения чисел, строк и других значений всегда используй ==.
Почему is иногда возвращает True для одинаковых чисел?
Из-за кэша маленьких целых чисел (−5…256): Python переиспользует для них один объект. Это деталь реализации, полагаться на неё нельзя — для чисел сравнивай через ==.
Кот-наставник— Правило почти без исключений: значения сравнивай через
==, аisдержи для одного случая — проверки наNone.— Увидишь
if x is 5— это почти наверняка баг. Иногда сработает из-за кэша чисел, но полагаться на это нельзя. Нужно значение — только==.
Сравнения в Python — на практике
На SkillPy ты пишешь условия сам, а AI-наставник замечает, где вместо == закрался is, и объясняет, почему код сработал не так. Он понимает твоё решение, а не сверяет с шаблоном.
