В Python есть два оператора для проверки на равенство: ==
и is
. На первый взгляд может показаться, что эти операторы делают одно и то же, но они совершенно разные.
Основное различие между ==
и is
заключается в том, что
==
сравнивает значения двух объектовis
сравнивает идентичность двух объектов
Пример 1
x = [1, 2, 3] y = [1, 2, 3] if x == y: print("x and y have the same values") if x is y: print("x and y are the same object") else: print("x and y are different objects") # Output: # x and y have the same values # x and y are different objects
Когда мы присваиваем [1, 2, 3]
значениям x
и y
, Python создает в памяти два отдельных объекта списка, каждый со своим уникальным адресом памяти. Несмотря на то, что два списка имеют одинаковые значения, они хранятся в разных местах памяти. Следовательно, x
и y
— разные объекты, а x is y
— это False
.
Пример 2
a = "hello" b = "hello" print(a is b) # True print(a == b) # True
В Python небольшие строки (например, «привет») кэшируются и повторно используются интерпретатором для экономии памяти. Это означает, что когда мы присваиваем значение «привет» обеим переменным a
и b
, Python ищет в кеше строку «привет». Поскольку строка уже существует в кэше, Python не создает новый строковый объект, а вместо этого присваивает обеим переменным ссылки на один и тот же объект. Таким образом, объект один и тот же для обеих переменных.
Краткое содержание
Чтобы проверить, относятся ли a
и b
к одному и тому же объекту в памяти, мы используем оператор is
, который по существу эквивалентен проверке, если id(a) == id(b)
. С другой стороны, чтобы проверить, равны ли значения a
и b
, мы используем оператор ==
, который вызывает метод __eq__()
объекта a
.
В большинстве случаев, если a is b
возвращает True
, это означает, что a
и b
ссылаются на одну и ту же ячейку памяти, и, таким образом, a == b
также возвращает True
, указывая на то, что их значения равны.