Автор: CoolPython
==
проверяет, одинаковые ли значения у переменных. 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
Для некоторых классов оператор ==
тоже сработает, но так лучше не делать, потому что в пользовательских классах этот оператор можно переопределить и выстрелить себе в ногу получить интересные результаты. Поэтому в PEP8 и рекомендуют проверять на значение None
именно с помощью is
.