На этом шаге мы рассмотрим разницу между этими конструкциями.
Существует разница в смысле между понятиями "равенство" и "тождество". И эта разница крайне важна для понимания того, как ведут себя операторы сравнения Python is и ==.
Оператор == выполняет сравнение путем проверки на равенство.
Однако оператор is сравнивает идентичности.
Давайте взглянем на небольшой реальный код Python.
Прежде всего, мы создадим новый объект-список и назовем его а, а затем определим еще одну переменную (b), которая указывает на тот же самый объект-список:
>>> a = [1, 2, 3] >>> b = a
Давайте изучим эти две переменные. Мы видим, что они указывают на внешне идентичные списки:
>>> a [1, 2, 3] >>> b [1, 2, 3]
Когда мы сравним эти два объекта-списка на равенство при помощи оператора ==, мы получим ожидаемый результат, поскольку эти два объекта-списка выглядят одинаково:
>>> a == b
True
Однако этот результат не говорит о том, указывают ли а и b в действительности на тот же самый объект. Конечно, мы знаем, что это так, потому что мы определили их ранее, но предположим, что мы не знаем, - тогда как можно было бы это узнать?
Ответ на этот вопрос следует искать в сравнении обеих переменных оператором is. Это сравнение подтверждает, что обе переменные в действительности указывают на один объект-список:
>>> a is b True
Давайте посмотрим, что происходит, когда мы создаем идентичную копию нашего объекта-списка. Это можно сделать, вызвав list() с существующим списком в качестве аргумента, чтобы создать копию, которую мы назовем с:
>>> с = list(a)
И снова вы увидите, что только что созданный нами новый список выглядит идентичным объекту-списку, на который указывают а и b
>>> с
[1, 2, 3]
А вот теперь начинается самое интересное. Давайте сравним нашу копию списка c с первоначальным списком а, использовав для этого оператор ==. Какой ответ вы ожидаете увидеть?
>>> а == c
True
О'кей. Надеюсь, что вы как раз этого и ожидали. Данный результат говорит следующее: c и а имеют одинаковое содержимое. Python их считает равными. Но вот вопрос: указывают ли они в действительности на один и тот же объект? Давайте это выясним при помощи оператора is:
>>> a is c False
О-па! И вот тут мы получаем другой результат. Python говорит, что c и а указывают на два разных объекта, несмотря на то что их содержимое может быть одинаковым.
Итак, чтобы подытожить, давайте попробуем разложить разницу между is и == на два коротких определения:
Всякий раз, когда вам придется решать, применять оператор is или оператор ==, просто вспомните эти определения. Если вы это будете делать, то у вас все будет в порядке.
На следующем шаге мы рассмотрим преобразование строк.