Чем is отличается от == в Python
Оператор « == »
возвращает True
, если сравниваемые объекты имеют одинаковые значения.Оператор is
возвращает True
, если сравниваемые объекты, помимо того, что имеют одинаковые значения, еще и ссылаются на одну и ту же область памяти. Таким образом, is отличается от == в Python дополнительной проверкой на идентичность адресов в памяти, на которые ссылаются переменные.
Протестируем работу операторов сравнения!
Для начала создадим 2 разных объекта с одинаковыми значениями. При этом ссылаться созданные объекты будут на разные ячейки памяти. Кстати, узнавать адрес в памяти, по которому хранятся объекты, мы будем с помощью функции id()
:
a = 1000
b = 700 + 300
# узнаем адреса в памяти, на которые
# указывают переменные a и b:
print(id(a), id(b))
print('\nРезультат сравнения a и b с помощью оператора "==": ')
print(a == b)
print('\nРезультат сравнения a и b с помощью оператора "is": ')
print(a is b)
Вывод на экран:
140583993536752 140583993536816 Результат сравнения a и b с помощью оператора "==": True Результат сравнения a и b с помощью оператора "is": False
Как видно из приведенного выше примера, переменные a
и b
ссылаются на разные области в памяти, хотя и имеют одинаковые значения: a = 1000
и b = 1000
. Так как при сравнении переменных посредством оператора «==» сравниваются только значения переменных, то результатом сравнения a == b
является True
. При этом результат сравнения переменных посредством оператора «is«: a is b
оказался равен False
, так как эти переменные ссылаются на разные области в памяти:
id(a) = 140583993536560 id(b) = 140583993536592
Какой оператор выбрать для сравнения: == или is?
Таким образом, подытожим все выше сказанное: для сравнения значений переменных используйте оператор «==». В тех случаях, когда важно, чтобы переменные указывали на одну и ту же область в памяти, используйте оператор «is». На этом можно было бы считать статью завершенной, если бы не маленькое НО, которое можно считать изюминкой (или сморщенной виноградинкой 😉 ) Python:
Кеширование малых чисел в Python!
Python кеширует в памяти все числа от -5 до 256
. Это значит, что для каждого числа из указанного диапазона в Python отводится отдельная область в памяти. И любая переменная со значением из указанного диапазона будет ссылаться на эту заранее выделенную область в памяти. Поэтому, если у сравниваемых переменных одинаковые значения, которые попадают в диапазон от -5 до 256
, то эти переменные ссылаются на один и тот же адрес в памяти, и, соответственно, результат сравнения x is y
будет равен True
:
''' Значение 5 попадает в диапазон [-5, 256],
поэтому Python его закешировал => a и b
ссылаются на одну и ту же область в памяти:'''
a = 5
b = 2 + 3
print(a is b)
print(id(a), id(b))
Вывод на экран: True 94247940637760 94247940637760
''' Значение 500 не попадает в диапазон [-5, 256],
поэтому Python его не кеширует => a и b
ссылаются разные области в памяти:'''
a = 500
b = 200 + 300
print(a is b)
print(id(a), id(b))
Вывод на экран: False 140583993537200 140583993537360
Таким образом, если значения сравниваемых переменных попадают в диапазон от -5 до 256
, то результаты сравнения операторами «==» и «is» будут одинаковы.
