Большинство начинающих программистов при использовании этих операторов сравнения считают, что это одно и то же. Вы, вероятно, обнаружите, что в большинстве случаев они дают один и тот же ответ, но наступит время, когда это не так, и вы будете чесать голову. Сегодня я хочу прояснить это недоразумение.
Посмотрим, где эти операторы дадут одинаковый ответ, а где нет.
>>> 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, если содержимое объектов, на которые ссылаются операнды, одинаково.