【问题标题】:Different behavior in python script and python idle?python脚本和python空闲中的不同行为?
【发布时间】:2015-07-07 06:07:27
【问题描述】:

在python空闲:

>>> 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脚本/空闲中两个对象的id是相同/唯一的?

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

我正在使用 CPython 2.7.5。

【问题讨论】:

标签: python python-2.7 cpython


【解决方案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 对象。这就是为什么小整数得到的结果与任何其他对象不同的原因。另请参阅以下问题:

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 2011-09-25
    • 2011-09-29
    • 1970-01-01
    • 2018-06-06
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多