Почему "a is b" ведет себя по-разному в интерактивном режиме и когда он запускается из сценария?

При попытке ответить на вопрос об использовании is Ключевое слово, я понял, что этот код:

Авторсценария:

a = 123456
b = 123456
print a is b # True

Интерактивный режим:

>>> a = 123456
>>> b = 123456
>>> a is b
False

давал разные выводы в режиме Python Interactive и когда он запускался из скрипта.

Из этого ответа:

Текущая реализация хранит массив целочисленных объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне, вы на самом деле просто получаете ссылку на существующий объект.

Итак, я ожидаю, что a is b возвращенный True только для целых чисел в диапазоне [-5, 256], Но это верно только в интерактивном режиме, а не в сценарии.

Вопрос: почему a is b ведет себя по-разному в интерактивном режиме и когда он запускается из сценария?


Примечание: протестировано в Python 2.7 и Python 3

1 ответ

Разница в том, как обрабатываются константы. В интерактивном режиме невозможно сказать, есть ли уже числовая константа или нет. Но для скомпилированного кода каждая константа внутренне сохраняется в таблице, а дубликаты удаляются. Но это деталь реализации, и она не обязательно должна быть верной для каждой версии Python.

Другие вопросы по тегам