控制台为相同的不可变对象分配不同的 ID [重复]

问题描述 投票:0回答:1

我使用的是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 tuples immutability
1个回答
0
投票

来自文档

Python 程序是由代码块构建的。一块就是一块 作为一个单元执行的 Python 程序文本。以下是 块:模块、函数体和类定义。 每个 交互输入的命令是一个块。脚本文件(如下所示的文件 解释器的标准输入或指定为命令行 解释器的参数)是一个代码块。脚本命令(a 使用 -c 选项在解释器命令行上指定的命令) 是一个代码块。作为顶级脚本运行的模块(作为模块

__main__
)从命令行使用 -m 参数也是一个代码块。传递给内置函数 eval() 的字符串参数和 exec() 是一个代码块。

那是因为您的第一个代码位于代码块(模块)内,并且它作为一个单元执行。但在交互式 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
指向同一个对象。

© www.soinside.com 2019 - 2024. All rights reserved.