Понимание поведения оператора is в Python с целыми числами

Оператор «is» в Python используется для проверки того, ссылаются ли две переменные на один и тот же объект в памяти. Он сравнивает адреса памяти объектов, а не их значения. Однако с целыми числами он может вести себя неожиданно из-за функции оптимизации в Python, называемой «целочисленное кэширование».

В Python небольшие целые числа (от -5 до 256) кэшируются и используются повторно. Это означает, что каждый раз, когда вы создаете целое число в этом диапазоне, Python всегда будет возвращать один и тот же объект из памяти. В результате при сравнении двух небольших целых чисел с помощью оператора «is» вы можете получить неожиданные результаты.

Вот пример, иллюстрирующий такое поведение:

a = 10
b = 10
c = 257
d = 257
print(a is b)  # True
print(c is d)  # False

В приведенном выше коде aи bприсвоено значение 10, которое попадает в диапазон кэшированных целых чисел. Следовательно, a is bвозвращает True, поскольку они относятся к одному и тому же объекту в памяти.

С другой стороны, cи dприсваивается значение 257, которое находится за пределами диапазона кэшированных целых чисел. Таким образом, c is dвозвращает False, поскольку они являются отдельными объектами в памяти.

Чтобы надежно сравнивать целочисленные значения, следует использовать оператор «==”, который проверяет равенство значений:

a = 10
b = 10
c = 257
d = 257
print(a == b)  # True
print(c == d)  # True

В этом измененном коде и a == b, и c == dвозвращают True, поскольку оператор «==” сравнивает значения целых чисел, а не их адреса в памяти.

В заключение: при сравнении целых чисел в Python обычно безопаснее использовать оператор «==” вместо «is», чтобы обеспечить согласованное поведение.