is
и is not
- два тождественных оператора в Python. Оператор is
не сравнивает значения переменных, а сравнивает тождества переменных. Рассмотрим это:
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> hex(id(a))
'0x1079b1440'
>>> hex(id(b))
'0x107960878'
>>> a is b
False
>>> a == b
True
>>>
В приведенном выше примере показано, что идентификатор (также может быть адресом памяти в Cpython) отличается как для a
, так и b
(хотя их значения одинаковы ). Вот почему, когда вы говорите a is b
, он возвращает false из-за несоответствия в тождествах обоих операндов. Однако, когда вы говорите a == b
, он возвращает true, потому что операция ==
проверяет, имеет ли оба операнда одно и то же значение, присвоенное им.
Интересный пример (для дополнительной оценки):
>>> del a
>>> del b
>>> a = 132
>>> b = 132
>>> hex(id(a))
'0x7faa2b609738'
>>> hex(id(b))
'0x7faa2b609738'
>>> a is b
True
>>> a == b
True
>>>
В приведенном выше примере, хотя a
и b
являются двумя разными переменными, a is b
возвращен True
. Это связано с тем, что тип a
является int
, который является неизменным объектом. Таким образом, python (я думаю, чтобы сохранить память) выделил тот же объект b
, когда он был создан с тем же значением. Таким образом, в этом случае идентичности согласованных переменных и a is b
оказались True
.
Это применимо ко всем неизменяемым объектам:
>>> del a
>>> del b
>>> a = "asd"
>>> b = "asd"
>>> hex(id(a))
'0x1079b05a8'
>>> hex(id(b))
'0x1079b05a8'
>>> a is b
True
>>> a == b
True
>>>
Надеюсь, что помогает.