Для начала мы создадим объект типа 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
, если переменные имеют идентичное содержимое (значение).
Если добавить немного жизненного, то два котенка-близнеца одинаковы, но и различны.