在Python中,单下划线"_"是一个内置变量吗?

36

我不明白这个单下划线是什么意思。它是一个魔法变量吗?我在locals()和globals()中都看不到它。

>>> 'abc'
'abc'
>>> len(_)
3
>>> 

3个回答

55
在标准的Python REPL中,_代表最后一个返回的值--在调用len(_)时,_的值是'abc'
例如:
>>> 10
10
>>> _
10
>>> _ + 5
15
>>> _ + 5
20

这由sys.displayhook处理,_变量与像intsum这样的内容一起进入builtins命名空间,这就是为什么您无法在globals()中找到它的原因。

请注意,在Python 脚本中没有这样的功能。在脚本中,_没有特殊含义,并且不会自动设置为前一条语句产生的值。

此外,如果您想像上面那样使用它,请小心不要在REPL中重新分配_

>>> _ = "underscore"
>>> 10
10
>>> _ + 5

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    _ + 5
TypeError: cannot concatenate 'str' and 'int' objects

这将创建一个全局变量,它会覆盖内置的_变量。要撤消此赋值(并从全局中删除_),您需要执行以下操作:

>>> del _

那么功能将恢复正常(builtins._ 将再次可见)。


8
FYI:REPL 是 Read-Eval-Print Loop 的缩写。如需了解更多信息,可参考维基百科:http://en.wikipedia.org/wiki/Read-eval-print_loop。 - David Locke
什么是“平凡的标识符”?快速搜索结果显示“只是平均水平;很普通;平庸” - 这对 Python 脚本中的“_”有何意义? - user937284
请注意:_变量应被用户视为只读。不要显式地给它赋值,否则你将创建一个独立的本地变量,掩盖了具有其魔法行为的内置变量。 - RBT

18

为什么你看不到它?它在__builtins__中。

>>> __builtins__._ is _
True

这既不是全局的,也不是局部的。1

那么这个赋值操作在哪里发生呢?sys.displayhook

>>> import sys
>>> help(sys.displayhook)
Help on built-in function displayhook in module sys:

displayhook(...)
    displayhook(object) -> None

    Print an object to sys.stdout and also save it in __builtin__.
< p > < sup > 1 2012年编辑:我将其称为"超全局变量",因为__builtin__的成员在任何模块中都可以使用。


1
为什么只能在 REPL 中使用而不能在脚本中使用的东西被放置在 builtin 中? - user937284

2
通常我们在Python中使用下划线(_)来绑定ugettext函数。

1
这也是正确的,但仅适用于 Python 应用程序。 gettext.install 将绑定到 __builtins__.__,因此可以在整个应用程序中不导入即可使用;因此是同一种“魔法”名称。 - u0b34a0f6ae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接