В чем разница между операторами "is" и "==" в Python
Список вопросов к Python собеседованию
Определение и особенности операторов сравнения
- оператор
==
проверяет равенство значений двух объектов; - оператор
is
проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти.
Два объекта, имеющие одинаковые значения, не обязательно идентичны.
Python (CPython, если быть точнее) в целях производительности кеширует короткие строки и малые целые числа. Подробнее тут - “What the f*ck Python!”.1
Под целые числа из диапазона от -5 до 256 включительно интерпретатор заранее выделяет место в памяти и даёт переменным ссылки на эти объекты, поэтому возможны такие казусы:
|
|
Оператор
is
- это в общем-то “синтаксический сахар”:a is b
по факту обертка дляid(a) == id(b)
Что PEP8 говорит об этом?
Сравнение с синглтонами, такими как None
, всегда должно производиться с помощью операторов is
или is not
, и никогда с помощью операторов равенства (==
и !=
).
Кроме того, остерегайтесь записи, if x
, если на самом деле имеете в виду, if x is not None
- например, при проверке того, было ли переменной или аргументу, который по умолчанию равен None
, присвоено какое-либо другое значение. Другое значение может иметь тип (например, контейнер), который в булевом контексте может иметь значение False
!2
is
работает быстрее, чем==
. В конце концов,is
реализовано на C и представляет собой простое сравнение идентификаторов двух объектов. Вызов функции не требуется, и нам, конечно же, не нужно сравнивать значения двух объектов, что также может занять некоторое время.3
Варианты применения is
и ==
Примеры использования is
включают:4
None
- значения
enum
(при использованииEnums
из модуляenum
) - модули
- объекты класса, полученные из определений классов (зачастую)
- функциональные объекты, полученные в результате определений функций (зачастую)
- все остальное, что должно существовать в памяти только один раз (как правило, все синглтоны)
- конкретный объект, который вы хотите проверить по идентичности
Обычные варианты использования ==
включают:
- числа, в том числе целые
- строки
- списки
- множества
- словари
- кастомные изменяемые объекты
- в большинстве случаев другие встроенные неизменяемые объекты