В чем разница между операторами "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) - модули
- объекты класса, полученные из определений классов (зачастую)
- функциональные объекты, полученные в результате определений функций (зачастую)
- все остальное, что должно существовать в памяти только один раз (как правило, все синглтоны)
- конкретный объект, который вы хотите проверить по идентичности
Обычные варианты использования == включают:
- числа, в том числе целые
- строки
- списки
- множества
- словари
- кастомные изменяемые объекты
- в большинстве случаев другие встроенные неизменяемые объекты