Идентичность как неверное понимание равенства

Еще одна распространенная ошибка – перепутать оператор равенства == и оператор идентичности is при сравнении целых чисел. Поскольку Python использует кэширование для целых чисел, об этой ошибке можно и не узнать.

Чтобы понять эту концепцию, рассмотрим два примера.

Пример 1.

В этом примере, использованы две переменные с именами sum и add. Каждая из них хранит сумму двух целых чисел. Затем мы сравниваем две переменные при помощи оператора равенства оператора (==), здесь возвращается True, потому что обе переменные содержат одинаковое значение. Дальше эти же переменные сравниваются при помощи оператора тождественности is”, и тоже возвращается True. Причина в том, что для из значений выделен один и тот же адрес. Это видно по значениям id, напечатанным в конце.

Но тот, кто писал этот код, не осознал, как получилось так, что две различные операции “==” и “is” дали одинаковый результат. И неосознанно сделал ошибку.

Пример1. Равентсво и идентиченость

Тем не менее, эта ошибка дает о себе знать в следующем примере.

Пример 2.

В этом примере использованы бОльшие целые числа. Подвох в том, что Python кэширует только целые число от -5 до 256, в то время как большие числа размещаются по разным адресам
Следовательно, при сопоставлении больших целых чисел с единицей оператор is не даст такой же результат, как в предыдущем примере.

Вывод простой – прежде чем сделать слепо использовать каждую из конструкций, нужно точно понимать, какой результат вы хотите получить.

Более подробно о том, как Python обрабатывает целые числа, можно прочитать на английском языке здесь

Поделитесь с друзьями:

Оставьте комментарий