Короткий ответ
== проверяет равенство значений двух объектов, а is — ссылаются ли переменные на один и тот же объект в памяти. Для сравнения содержимого используют ==, а is — для синглтонов вроде None.
Как это работает подробнее
Результаты операторов могут расходиться: одинаковые значения часто хранятся в разных объектах.
- Равенство значений.
==сравнивает содержимое объектов и возвращает true, когда оно эквивалентно, даже если объекты разные. - Идентичность.
isистинен только когда обе переменные хранят ссылку на один и тот же объект. - Синглтоны.
None,TrueиFalseсуществуют в единственном экземпляре, поэтому сравнение черезisнадёжно и быстрее.
Пример кода
Сравнение значений и идентичности
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True — значения списков равны
print(a is b) # False — это два разных объекта в памяти
print(a is c) # True — c и a ссылаются на один и тот же списокЧто использовать на практике
- Сравнение значений. Для строк, списков, чисел и других данных всегда применяй
==. - Проверка на None. Используй идиоматичную запись
x is None— она надёжна и быстрее. - Осторожность с is. Для значений на
isне полагайся: интерпретатор может кэшировать объекты.
Подводные камни
- Кэш малых чисел. CPython переиспользует целые от -5 до 256, и
isдля них иногда возвращает true, но рассчитывать на это нельзя. - Интернирование строк. Некоторые строки кэшируются интерпретатором, из-за чего
isведёт себя неочевидно. - Иллюзия равенства. Списки с одинаковым содержимым — разные объекты, поэтому
isвернёт false даже при равных значениях.
Как отвечать на собеседовании
- Начни с коротких определений обоих операторов → приведи пример со списками, где значения равны, а объекты разные → объясни, что для
Noneнуженis→ предупреди о кэше малых чисел и интернировании строк.