Найти в Дзене
Python для школьников

Разница между is и == в Python

В Python операторы is и == используются для сравнения, но делают это принципиально по-разному. Разберемся, почему так происходит. == - сравнение значений объектов Проверяет, равны ли значения объектов, вызывая метод __eq__() is - сравнение id объектов Проверяет, ссылаются ли переменные на один и тот же объект в памяти, сравнивая их id От этой характеристики зависит поведение операторов is и ==. Неизменяемыми (иммутабельными) объекты в Python - числа, булевы значения (True/False), строки и кортежи. После создания их содержимое остаётся постоянным. Пример с числом: Изменяемые (мутабельные) объекты в Python - это списки, множества и словари. Пример со списком: == → True, потому что значения одинаковые. is → True, потому что Python оптимизирует память, храня маленькие числа (-5 до 256) в виде одного объекта (синглтона).
➜ id(a) == id(b) (один и тот же объект в памяти). == → True, потому что списки содержат одинаковые элементы. is → False, потому что a и b - разные объекты (хоть и с одинак
Оглавление

В Python операторы is и == используются для сравнения, но делают это принципиально по-разному. Разберемся, почему так происходит.

Основное отличие is и ==

== - сравнение значений объектов

Проверяет, равны ли значения объектов, вызывая метод __eq__()

is - сравнение id объектов

Проверяет, ссылаются ли переменные на один и тот же объект в памяти, сравнивая их id

Изменяемость и неизменяемость объектов

От этой характеристики зависит поведение операторов is и ==.

Неизменяемыми (иммутабельными) объекты в Python - числа, булевы значения (True/False), строки и кортежи. После создания их содержимое остаётся постоянным.

Пример с числом:

Изменяемые (мутабельные) объекты в Python - это списки, множества и словари.

Пример со списком:

-2

Сравнение неизменяемых типов

-3

== → True, потому что значения одинаковые.

is → True, потому что Python оптимизирует память, храня маленькие числа (-5 до 256) в виде одного объекта (синглтона).
➜ id(a) == id(b) (один и тот же объект в памяти).

Сравнение изменяемых типов

Сравнение списков (разные объекты)

-4

== → True, потому что списки содержат одинаковые элементы.

is → False, потому что a и b - разные объекты (хоть и с одинаковым содержимым).
➜ id(a) != id(b) (разные ячейки памяти).

Пример

-5

Присваивание списка (одна ссылка)

-6

== → True, потому что списки одинаковые.

is → True, потому что b - это просто новая ссылка на тот же объект, что и a.
➜ id(a) == id(b) (одна и та же память).

Копирование списка (новый объект)

-7

== → True, потому что содержимое одинаковое.

is → False, потому что a.copy() создаёт новый объект в памяти.
➜ id(a) != id(b) (разные объекты).

Сравнение с None, True, False

Сравнение с None

-8

Почему is лучше?

None - единственный объект в памяти, поэтому is работает быстрее.

== может дать неожиданные результаты, если переопределён __eq__.

Сравнение с True и False

-9

Когда is с булевыми значениями может дать False?

-10

Итоги

Используйте == - когда важно значение (например, сравнение чисел, строк, списков).

Используйте is - когда важно проверить, один ли это объект (например, is None, is True, или при работе с изменяемыми типами).

Важно: Для None, True, False всегда используйте is, а не ==, это быстрее работает и помогает избежать багов.