在 Python IDLE 中:
>>> a=1.1 >>> b=1.1 >>> a is b False
但是当我将代码放入脚本并运行它时,我会得到不同的结果:
$cat t.py a=1.1 b=1.1 print a is b $python t.py True
为什么会发生这种情况?我知道is比较id两个对象的,那么为什么在 Python 脚本/IDLE 中两个对象的 ID 相同/唯一?
is
id
我还发现,如果我使用小整数,例如1,而不是1.1,则 Python 脚本和 Python IDLE 中的结果将相同。为什么小整数和小浮点数的行为不同?
1
1.1
我正在使用 CPython 2.7.5。
当 Python 执行脚本文件时,会先解析整个文件。你可以注意到,当你在某处引入语法错误时:无论它在哪里,它都会阻止任何一行的执行。
因此,由于 Python 首先解析文件,因此文字可以有效地加载到内存中。由于 Python 知道这些是常量,因此表示这些常量值的所有变量都可以指向内存中的同一个对象。因此该对象是共享的。
这适用于整数和浮点数,甚至适用于字符串;即使存在需要先评估的常量表达式:
a = "foo" b = "foo" c = "fo" + "o" print(a is b) print(a is c)
现在,在 IDLE 中,行为非常不同:作为交互式解释器,IDLE 单独执行每一行。因此a = 1.1和b = 1.1在单独的上下文中执行,这使得不可能(或非常难以)弄清楚它们都共享相同的常量文字值并且可以共享内存。因此,解释器将分配两个不同的对象,这导致身份检查使用is失败。
a = 1.1
b = 1.1
对于小整数,情况略有不同。由于它们经常使用,CPython 会静态存储一组整数(范围在 -5 到 256 之间),并使这些整数的每个值都指向同一个int对象。这就是为什么小整数的结果与任何其他对象的结果都不同。
int