代码下划线和解释器之间有什么区别?

fun*_*200 7 python python-3.7

我在玩_Python解释器中的下划线,并想尝试一下它在代码中是否具有相同的行为。我在代码中使用下划线作为“无关”变量,如下所示:

_, a = someFunction()
Run Code Online (Sandbox Code Playgroud)

并在解释器中获取最后存储的值,如下所示:

>>> 2 + 2
4
>>> a = _
>>> a
4
Run Code Online (Sandbox Code Playgroud)

现在,我尝试执行以下示例代码:

for i in range(5):
    2 + 1
    a = _

print (a)
Run Code Online (Sandbox Code Playgroud)

在解释器中以及用Python脚本编写并使用来运行python underscore.py
考虑到_下划线将保存最后存储的值的行为,因为下划线不会被格式化为“无关”变量,因此预期的结果将是2 + 1 = 3,使3最后存储的值被保存到a用变量a = _

口译员的结果如下:

>>> for i in range(5):
...     2 + 1
...     a = _
...
3
3
3
3
3
>>> print(a)
3
Run Code Online (Sandbox Code Playgroud)

此结果按预期方式运行,而将相同代码的结果保存在Python脚本中并使用运行时python underscore.py,导致名称错误:

C:\Users\..\Python files>python underscore.py
Traceback (most recent call last):
  File "underscore.py", line 3, in <module>
    a = _
NameError: name '_' is not defined
Run Code Online (Sandbox Code Playgroud)

读取错误时,听起来逻辑上_未定义该变量,但是,尽管它可能与Python运行脚本的方式有关,但我只是想知道这两种情况之间的差异是什么导致结果有点逻辑的答案(当您使用这样的解释器已有一段时间了)还是名称错误?

所以请不要误解我,我确实知道该_符号在Python中的作用。我要问的是为什么与在终端中以Python程序运行时,为什么完全相同的代码在解释器中的行为不同?

fun*_*200 5

对于任何觉得有趣的人,在@Chris_Rands的帮助下,我发现Python解释器使用来存储最后使用的值sys.displayhook,更多内容请参见这里

sys.displayhook在评估在交互式 Python会话中输入的表达式的结果时调用。这意味着它将仅在解释器中具有此行为,而不会在终端中运行的Python脚本中具有此行为。