В чем разница между операторами "is" и "==" в Python

Предупреждение
Последний раз данная статья обновлялась 23.05.2022, информация может быть устаревшей.

Список вопросов к Python собеседованию

  • оператор == проверяет равенство значений двух объектов;
  • оператор is проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти.

Два объекта, имеющие одинаковые значения, не обязательно идентичны.

Python (CPython, если быть точнее) в целях производительности кеширует короткие строки и малые целые числа. Подробнее тут - “What the f*ck Python!”.1

Под целые числа из диапазона от -5 до 256 включительно интерпретатор заранее выделяет место в памяти и даёт переменным ссылки на эти объекты, поэтому возможны такие казусы:

1
2
3
4
str1 = 'hello'
str2 = 'hello'
str1 == str2  # True
str1 is str2  # True

Оператор is - это в общем-то “синтаксический сахар”: a is b по факту обертка для id(a) == id(b)

Сравнение с синглтонами, такими как None, всегда должно производиться с помощью операторов is или is not, и никогда с помощью операторов равенства (== и !=).

Кроме того, остерегайтесь записи, if x, если на самом деле имеете в виду, if x is not None - например, при проверке того, было ли переменной или аргументу, который по умолчанию равен None, присвоено какое-либо другое значение. Другое значение может иметь тип (например, контейнер), который в булевом контексте может иметь значение False!2

is работает быстрее, чем ==. В конце концов, is реализовано на C и представляет собой простое сравнение идентификаторов двух объектов. Вызов функции не требуется, и нам, конечно же, не нужно сравнивать значения двух объектов, что также может занять некоторое время.3

Примеры использования is включают:4

  • None
  • значения enum (при использовании Enums из модуля enum)
  • модули
  • объекты класса, полученные из определений классов (зачастую)
  • функциональные объекты, полученные в результате определений функций (зачастую)
  • все остальное, что должно существовать в памяти только один раз (как правило, все синглтоны)
  • конкретный объект, который вы хотите проверить по идентичности

Обычные варианты использования == включают:

  • числа, в том числе целые
  • строки
  • списки
  • множества
  • словари
  • кастомные изменяемые объекты
  • в большинстве случаев другие встроенные неизменяемые объекты