Шаг 58.
Python: тонкости программирования.
Классы и ООП. Сравнения объектов: is против ==

    На этом шаге мы рассмотрим разницу между этими конструкциями.

    Существует разница в смысле между понятиями "равенство" и "тождество". И эта разница крайне важна для понимания того, как ведут себя операторы сравнения 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 или оператор ==, просто вспомните эти определения. Если вы это будете делать, то у вас все будет в порядке.

    На следующем шаге мы рассмотрим преобразование строк.




Предыдущий шаг Содержание Следующий шаг