🤔 Что использовать в python: is или ==?

 

­­Привет, друзья! Надеюсь, вы уже успели немного отдохнуть. Сегодня мы с вами обсудим интересную тему, кстати вопросы по ней вполне могут вам задать на собеседовании.



⚠️ Как вы знаете, в python есть два очень похожих оператора для проверки равенства двух объектов. Эти два оператора is и ==. Почему важно о них вспомнить? is и == обычно путают друг с другом, потому что с простыми типами данных они, кажется, делают то же самое.

Смотрите на первую картинку в карусели 👉



🧐 Однако, если провести эксперимент со сложными типами данных, мы убедимся, что поведение is и == отличается.

Смотрите на вторую картинку в карусели 👉



На этом шаге, мы делаем вывод, что разница между is и == заключается в том, что is проверяет идентичность объектов, а == проверяет равенство значения. Смотрите на третью картинку в карусели 👉

Давайте эту мысль разберем на примере.

 

⁉️ Почему же так происходит?

Чтобы более подробно рассмотреть концепцию изменчивости, воспользуемся м функцией id(), которая выводит уникальный идентификатор для каждого объекта.

Мы заметим, что переменные list_1 и list_2 ссылаются на один и тот же объект в памяти, однако, если мы создаем новую переменную list_3, пусть даже с тем же значением, что и у list_1 и list_2, в памяти создается новый объект, для которого выделено отличное от list_1 и list_2 место в памяти.



Смотрите на четвертую картинку в карусели 👉

 

⚠️ Важное наблюдение: с простыми типами данных концепция изменчивости работает в обе стороны: объекты идентичны и равны между собой. Это происходит потому, что python обрабатывает неизменяемые типы данных (int, float, decimal, bool, string, tuple) иначе, чем изменяемые, то есть сохраняет их в памяти только один раз. Со сложными типами данных работа с памятью происходит иначе: при создании нескольких объектов с одинаковыми значениями, будут создаваться новые объекты в памяти.



Давайте подведем краткие итоги:



✔️ ==  проверяет равенство (по значению) и is проверяет идентичность двух объектов, то есть проверяет их адреса в памяти.

✔️ Используйте is, когда хотите сравнить объект с None.

✔️ Обычно is быстрее, чем оператор ==, так как он проверяет целочисленное равенство адреса в памяти.

✔️ Будьте аккуратны с операторами != и is not. Поэкспериментируйте с ними на примерах, которые разобраны выше, вы увидите, что их принцип работы немного отличается.