Еще одна распространенная ошибка – перепутать оператор равенства == и оператор идентичности is при сравнении целых чисел. Поскольку Python использует кэширование для целых чисел, об этой ошибке можно и не узнать.
Чтобы понять эту концепцию, рассмотрим два примера.
Пример 1.
В этом примере, использованы две переменные с именами sum и add. Каждая из них хранит сумму двух целых чисел. Затем мы сравниваем две переменные при помощи оператора равенства оператора (==), здесь возвращается True, потому что обе переменные содержат одинаковое значение. Дальше эти же переменные сравниваются при помощи оператора тождественности is”, и тоже возвращается True. Причина в том, что для из значений выделен один и тот же адрес. Это видно по значениям id, напечатанным в конце.
Но тот, кто писал этот код, не осознал, как получилось так, что две различные операции “==” и “is” дали одинаковый результат. И неосознанно сделал ошибку.
Тем не менее, эта ошибка дает о себе знать в следующем примере.
Пример 2.
В этом примере использованы бОльшие целые числа. Подвох в том, что Python кэширует только целые число от -5 до 256, в то время как большие числа размещаются по разным адресам
Следовательно, при сопоставлении больших целых чисел с единицей оператор is не даст такой же результат, как в предыдущем примере.
Вывод простой – прежде чем сделать слепо использовать каждую из конструкций, нужно точно понимать, какой результат вы хотите получить.
Более подробно о том, как Python обрабатывает целые числа, можно прочитать на английском языке здесь