В 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 - разные объекты (хоть и с одинак