2014-06-08 2 views
6

При попытке ответить на вопрос о использовании is ключевого слова, я понял, что этот код:Почему «a is b» ведет себя по-разному в интерактивном режиме и когда он запускается из сценария?

Сценарий:

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

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

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

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

От this answer:

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

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

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


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

+2

Результаты одинаковы на Python 3. 'False' для интерактивного сценария' True' для скрипта. – vaultah

+0

Python 3.3 ведет себя как 2.7. Интересно, что '>>> a = b; >>> a is b' возвращает 'True'. – Davidmh

ответ

1

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