小能豆

Python 脚本和 Python IDLE 中的行为有何不同?

py

在 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 相同/唯一?

我还发现,如果我使用小整数,例如1,而不是1.1,则 Python 脚本和 Python IDLE 中的结果将相同。为什么小整数和小浮点数的行为不同?

我正在使用 CPython 2.7.5。


阅读 8

收藏
2024-10-28

共1个答案

小能豆

当 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对象。这就是为什么小整数的结果与任何其他对象的结果都不同。

2024-10-28