单下划线 "_" 是 Python 的内置变量吗?

37 投票
3 回答
6393 浏览
提问于 2025-04-15 14:55

我不太明白这个单下划线是什么意思。它是个神奇的变量吗?我在 locals() 和 globals() 里看不到它。

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

3 个回答

2

通常,我们在Python中使用下划线(_)来绑定一个叫做ugettext的函数。

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__.

1 2012年编辑:我会称它为 "超级全局",因为 __builtin__ 的成员在任何地方、任何模块都可以使用。

56

在标准的Python交互式环境中,_代表的是上一次返回的值——当你调用len(_)时,_的值是'abc'

举个例子:

>>> 10
10
>>> _
10
>>> _ + 5
15
>>> _ + 5
20

这个功能是由sys.displayhook来处理的,_这个变量属于builtins命名空间,就像intsum一样,所以你在globals()里找不到它。

需要注意的是,在Python的脚本中没有这样的功能。在脚本中,_没有特别的含义,也不会自动设置为上一个语句产生的值。

另外,如果你想像上面那样使用_,在交互式环境中重新赋值给_时要小心!

>>> _ = "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._会再次可见)。

撰写回答