== проверяет, одинаковые ли значения у переменных.is проверяет, указывают ли переменные на один и тот же объект.Рассмотрим на примере. Создадим словарь и скопируем ссылку на него:
a = [1, 2, 3]Теперь создадим новый словарь с помощью копирования:
b = a
b is a # True
b == a # True
b = a[:]Но из-за того, что мы скопировали в новый объект все значения старого, то содержимое двух словарей все равно совпадает:
b is a # False
>>> b == a # TrueТо есть,
a is b по сути то же, что id(a) == id(b). Поэтому если a is b вернет True, это будет значить, что и содержимое у них одинаковое. Просто потому что это один и тот же объект.Кстати, чтобы проверить, есть ли вообще у переменной значение, обычно пользуются оператором
is, а не ==:a = 42Дело в том, что класс
a is None # False
None реализован как синглтон. Это значит, что экземпляр этого класса существует в интерпретаторе в единственном числе и все неопределенные значения указывают на него. a = NoneДля некоторых классов оператор
b = None
a is b # True
== тоже сработает, но так лучше не делать, потому что в пользовательских классах этот оператор можно переопределить и None именно с помощью is. 🐍