【问题标题】:What is the difference between the underscore in code and in the interpreter?代码中的下划线和解释器中的下划线有什么区别?
【发布时间】:2019-09-21 23:22:29
【问题描述】:

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

_, a = someFunction()

并在解释器中获取最后存储的值,像这样:

>>> 2 + 2
4
>>> a = _
>>> a
4

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

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

print (a)

在解释器中以及用 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

此结果按预期工作,而保存在 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

读取错误时,听起来_ 变量未定义的逻辑,但是,虽然它可能与 Python 如何运行脚本有关,但我只是想知道这两种情况之间的区别是什么使结果产生一个有点合乎逻辑的答案(当你一直使用这样的解释器时)与名称错误?

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

【问题讨论】:

  • 如果您认为骗子错了,我可以重新打开,但您似乎已经了解其中的区别,所以我不确定您在问什么
  • @Chris_Rands 我只是想知道为什么_ 的行为在 Python 代码和解释器之间是不同的。您发布的答案是代码中_ 的含义,是的,我知道它的作用
  • 好的,我重新打开了,但你问他们什么?关于 python 解释器如何实现的内部结构?或者关于不同行为的基本原理?查找sys.displayhook
  • _ 的特殊赋值仅在您以交互模式执行表达式 时发生。这不是这里发生的事情 - 您正在执行一个 statementfor 循环),它没有分配任何价值。

标签: python python-3.7


【解决方案1】:

对于任何觉得有趣的人,在 @Chris_Rands 的帮助下,我发现 Python 解释器使用 sys.displayhook 存储上次使用的值,更多关于 here 的信息。

sys.displayhook 在计算 interactive Python 会话中输入的表达式的结果时调用。这意味着它只会在解释器中具有这种行为,而不是在终端中运行的 Python 脚本中。

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2014-10-05
    相关资源
    最近更新 更多