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

В обычном CPython ожидаются True и False, но полагаться на is для чисел нельзя. Гарантированы значения x == 100 и y == 1100, а не идентичность объектов.

Короткий ответ

Что ответить на собеседовании

В обычном CPython ожидаются True и False, но полагаться на is для чисел нельзя. Гарантированы значения x == 100 и y == 1100, а не идентичность объектов.

Подробный разбор

Ответ с пояснениями

Условие

Разберите, как Python сравнивает целочисленные объекты при помощи оператора is. Какой будет вывод у следующего кода?

x = 100
y = x
y += 1000

print(x is 100)
print(y is 1100)

Ответ

В обычном CPython ожидаются True и False, но полагаться на is для чисел нельзя. Гарантированы значения x == 100 и y == 1100, а не идентичность объектов.

y=x сначала создаёт вторую ссылку на то же число. После y += 1000 имя y связывается с результатом сложения, x остаётся равным 100. CPython обычно переиспользует объект малого числа 100, а вычисленное 1100 отличается от объекта соответствующего литерала.

Это особенности реализации и контекста исполнения, не переносимый контракт Python. Сравнение is с числовым литералом также может сопровождаться SyntaxWarning.

Правильная запись для проверки значений:

print(x == 100)   # True
print(y == 1100)  # True

is оставляйте для проверки идентичности, например value is None.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее