В 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, указывая на то, что их значения равны.