python脚本和python空闲中的不同行为?

时间:2015-07-07 06:07:27

标签: python python-2.7 cpython

在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,那么为什么两个对象的id在python脚本/ idle中是相同/唯一的?

我还发现,如果我使用一个小的int,例如1,而不是1.1,结果将在python脚本和python idle中相同。为什么小int和小浮点数有不同的行为?

我正在使用CPython 2.7.5。

1 个答案:

答案 0 :(得分:8)

当Python执行脚本文件时,首先解析整个文件。您可以注意到,当您在某处引入语法错误时:无论它在何处,都会阻止任何行执行。

因此,由于Python首先解析文件,因此可以将文字有效地加载到内存中。由于Python知道这些是常量,因此表示这些常量值的所有变量都可以指向内存中的同一对象。所以对象是共享的。

这适用于整数和浮点数,但即使是字符串;即使有一个需要首先评估的常量表达式:

a = "foo"
b = "foo"
c = "fo" + "o"
print(a is b)
print(a is c)

现在在IDLE中,行为非常不同:作为交互式解释器,IDLE分别执行每一行。所以a = 1.1b = 1.1在分离的上下文中执行,这使得它们不可能(或者只是非常难)弄清楚它们都共享相同的常量字面值并且可以共享内存。因此,解释器将分配两个不同的对象,这会导致使用is进行身份检查失败。

对于小整数,情况有点不同。因为它们经常被使用,所以CPython静态地存储一组整数(在-5到256之间的范围内)并使这些点的每个值都为相同的int对象。这就是为什么你得到小整数的结果不同于任何其他对象的结果。另见以下问题: