Оператор is в python
>>>a=100
>>>b=100
>>>a is b
True
>>>a=300
>>>b=300
>>>a is b
False
Почему оператор is выдаёт разные значения? И для чего он нужен?
Ответы (2 шт):
- оператор == проверяет равенство значений двух объектов
- оператор is проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти
Python (CPython, если быть точнее) в целях производительности кеширует короткие строки и малые целые числа, поэтому возможны такие казусы:
>>> str1 = 'hello'
>>> str2 = 'hello'
>>> str1 == str2
True
>>> str1 is str2
True
>>>
Оператор is - это в общем-то "синтаксический сахар".
a is b
По факту тут проверяется следующее:
id(a) == id(b)
Т.е. is проверяет, что a имеет тот же уникальный идентификатор, что и b, а значит обе переменные ссылаются на один и тот же объект.
Теперь о том, почему в каких-то случаях присваивание одинаковых значений приводит к тому, что переменные указывают на одни и те же объекты, а в каких-то нет. Это сильно зависит от реализации интерпретатора Python, и, как правильно заметил MaxU, под целые числа из диапазона от -5 до 256 включительно интерпретатор заранее выделяет место в памяти и даёт переменным ссылки на эти объекты. А под числа, не попадающие в диапазон, интерпретатор создаёт новые, отдельные объекты.
И это касается не только чисел. Если хотите больше знать, почитайте мега-разбор What the f*ck Python!, там много разных приколов Python объясняется, и этот случай там тоже разобран.