我使用的是Python 3.10.1。当我将以下代码作为
.py
文件运行时,它会打印 True
:
a = (1, 2)
b = (1, 2)
print(a is b)
但是,当我在交互式 Python 控制台中输入相同的代码行时,我得到了
False
。此外,当我分配给同一行上的两个变量时,即
a = (1, 2); b = (1, 2)
print(a is b)
我再次得到
True
。对于这种行为有一些解释还是一个错误?
来自文档:
Python 程序是由代码块构建的。一块就是一块 作为一个单元执行的 Python 程序文本。以下是 块:模块、函数体和类定义。 每个 交互输入的命令是一个块。脚本文件(如下所示的文件 解释器的标准输入或指定为命令行 解释器的参数)是一个代码块。脚本命令(a 使用 -c 选项在解释器命令行上指定的命令) 是一个代码块。作为顶级脚本运行的模块(作为模块
)从命令行使用 -m 参数也是一个代码块。传递给内置函数 eval() 的字符串参数和 exec() 是一个代码块。__main__
那是因为您的第一个代码位于代码块(模块)内,并且它作为一个单元执行。但在交互式 shell 中,当您在两个不同的命令中执行它们时,它们位于不同的代码块中。
Python 可以在代码块内重用一些不可变类型的引用,例如元组。这只是优化而不是错误。
这次我们用函数(记住函数体也是一个代码块)和大于 256 的整数来检查它:
# inside a python file
def fn1():
a = 1000
b = 1000
print("id of 'a'", id(a))
print("id of 'b'", id(b))
def fn2():
c = 1000
print("id of 'c'", id(c))
fn1()
fn2()
# id of 'a' 1738701965680
# id of 'b' 1738701965680
# id of 'c' 1738701965680
现在:
# inside interactive mode
>>> def fn1():
... a = 1000
... b = 1000
... print("id of 'a'", id(a))
... print("id of 'b'", id(b))
...
>>> def fn2():
... c = 1000
... print("id of 'c'", id(c))
...
>>> fn1()
id of 'a' 2441294813616
id of 'b' 2441294813616
>>> fn2()
id of 'c' 2441294813264
>>>
当
fn1
和 fn2
位于模块内时,它们在代码块内执行,但在第二个代码块中,它们不在模块中,而是单独执行。然而在 fn1
中,a
和 b
指向同一个对象。