Сравнение объектов: «is» vs «==»

Для начала мы создадим объект типа list и назовем его a, затем определим другую переменную и присвоим ей значение a.

a = [1, 2, 3]
b = a

Давайте посмотрим чему равны обе эти переменные.

a
[1, 2, 3]
b
[1, 2, 3]

Так как оба листа выглядят одинаковыми, то при сравнении их через оператор == мы получим ожидаемый результат True

a == b
True

Но на самом деле, это не говорит нам, что обе эти переменные ссылаются на один объект.

Мы коенчно знаем это, так как недавно мы присвоили b = a, но предположим что мы этого не знаем(так как во многих случаях мы реально не знаем этого). Как тогда узнать, ссылаются ли они на один объект или нет?

Ответ в том, что нужно использовать оператор ‘is’.

a is b
True

Давайте посмотрим, что будет если мы создадим идентичную копию списка a. Мы можем сделать это путем вызова функции list()

c = list(a)
c 
[1, 2, 3]

А теперь к интересному: Если мы сравним c и a через оператор == то получим результат True

a == c
True

Надеюсь вы этого же и ожидали. Этот результат говорит о том, что переменная с имеет то же содержимое что и переменная a. Вопрос второй: а ссылаются ли обе эти переменные на один объект?

a is c
False

Бум. Тут то мы и получили другой результат. Python говорит, что переменная c и переменная а ссылаются на разные объекты, даже с учетом того что они имеют одинаковое значение.

Давайте подведем итог в чем же разница между == и is

Оператор is выдает True только если обе переменные ссылаются на один и тот же объект.

Выражение == будет выдавать True если переменные имеют идентичное содержимое(значение).

Если добавить немного жизненного, то два близнеца котенка одинаковы, но и различны.