Эквивалентность значения теста оператора ==
. Оператор is
проверяет идентичность объекта, Python проверяет, действительно ли оба объекта являются одним и тем же объектом (т. Е. Живут ли они по одному адресу в памяти).
>>> a = 'banana'
>>> b = 'banana'
>>> a is b
True
В этом примере Python создал только один строковый объект, и оба a
и b
ссылаются на него. Причина в том, что Python внутренне кэширует и повторно использует некоторые строки в качестве оптимизации, на самом деле в памяти есть просто строка «банан», совместно используемая a и b; Чтобы вызвать нормальное поведение, вам нужно использовать более длинные строки:
>>> a = 'a longer banana'
>>> b = 'a longer banana'
>>> a == b, a is b
(True, False)
Когда вы создаете два списка, вы получаете два объекта:
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False
В этом случае мы бы сказали, что два списка эквивалентны, потому что они имеют одинаковые элементы, но не идентичны, потому что они не являются одним и тем же объектом. Если два объекта идентичны, они также эквивалентны, но если они эквивалентны, они не обязательно идентичны.
Если a
относится к объекту и вы присваиваете b = a
, тогда обе переменные ссылаются на один и тот же объект:
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True