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