Почему "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.