В обычном CPython ожидаются True и False, но полагаться на is для чисел нельзя. Гарантированы значения x == 100 и y == 1100, а не идентичность объектов.
Исследование оператора is и интернирования целых чисел в Python
В обычном 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.