Большинство начинающих программистов при использовании этих операторов сравнения считают, что это одно и то же. Вы, вероятно, обнаружите, что в большинстве случаев они дают один и тот же ответ, но наступит время, когда это не так, и вы будете чесать голову. Сегодня я хочу прояснить это недоразумение.

Посмотрим, где эти операторы дадут одинаковый ответ, а где нет.

>>> a = [1, 2, 3, 4]
>>> b = a
>>> a == b
True
>>> a is b
True

Так в чем разница? Давайте посмотрим на другой пример:

>>> a = [1, 2, 3, 4]
>>> b = [1, 2, 3, 4]
>>> a == b
True
>>> a is b
False

Интересное поведение. Давайте внимательнее посмотрим, что происходит под капотом. Я хотел бы отметить, что списки Python намного сложнее массивов, но я не буду здесь говорить об их реализации CPython. Однако, если вам интересно понять, как они реализованы, я настоятельно рекомендую прочитать этот пост Лорана Люса.

Когда вы назначаете список переменной, a, как в приведенном выше примере, Python выделяет память для этого списка, НО фактический список - это не то, что хранится в нашей переменной. Вместо этого Python создает объект списка и сохраняет ссылку на этот объект в переменной. По сути, наша переменная теперь указывает на список, как показано ниже:

В нашем первом примере мы сказали b = a. Это означает, что b ссылается на a, который ссылается на наш объект списка. Теперь они ссылаются на один и тот же объект.

Теперь, чтобы различать ‘==’ и ‘is’.

‘==’ проверяет равенство. Допустим, у нас была фабрика по производству футболок. Если изготовить две футболки и поставить рядом друг с другом, мы не сможем отличить их друг от друга. Таким образом, мы бы сказали, что две футболки - это ‘==’.

‘is’ проверяет личность. Мы знаем, что с нашими двумя футболками это не одно и то же. Таким образом, мы бы сказали, что футболка 1 - это футболка 2 - ложь.

С python это в основном то же самое, за исключением того, что с помощью оператора «is» мы проверяем ссылки.

В нашем первом примере 'a == b' возвращает true, потому что все, на что ссылается a, содержит те же самые вещи, что и b ссылается, И 'a is b' возвращает true, поскольку как a, так и b ссылаются на тот же объект списка.

Однако в нашем втором примере мы сказали a = [1, 2, 3, 4] и b = [1, 2, 3, 4]

Это создает объект списка и сохраняет ссылку на него в a, затем он создает второй объект списка и сохраняет ссылку на него в b.

‘a == b’ по-прежнему верно. Однако ‘a is b’ теперь false. Это связано с тем, что и a, и b теперь ссылаются на разные объекты. Это можно увидеть ниже:

В итоге

  • ‘is’ возвращает True, если операнды ссылаются на один и тот же объект.
  • ‘==’ возвращает True, если содержимое объектов, на которые ссылаются операнды, одинаково.