单下划线 "_" 是 Python 的内置变量吗?
我不太明白这个单下划线是什么意思。它是个神奇的变量吗?我在 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
命名空间,就像int
和sum
一样,所以你在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._
会再次可见)。