为什么"a is b"在交互模式下以及何时从脚本运行时表现不同?

Chr*_*ian 6 python integer python-interactive python-2.7

在尝试回答有关is关键字使用的问题时,我发现这段代码:

脚本:

a = 123456
b = 123456
print a is b # True
Run Code Online (Sandbox Code Playgroud)

互动模式:

>>> a = 123456
>>> b = 123456
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)

在Python交互模式下以及从脚本运行时提供不同的输出.

这个答案:

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用.

所以,我希望只a is b返回True范围内的整数[-5, 256].但它只适用于交互模式,而不是从脚本运行时.

问题:为什么a is b在交互模式下以及何时从脚本运行时表现不同?


注意:在Python 2.7和Python 3中测试

Dan*_*iel 2

区别在于常量的处理方式。在交互模式下,无法判断数字常量是否已经存在。但对于编译后的代码,每个常量都在内部保存到表中,并删除重复项。但这是一个实现细节,并不需要对每个 python 版本都是如此。