Сравнение объектов: «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, если переменные имеют идентичное содержимое (значение).

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