我不明白这个单下划线是什么意思。它是一个魔法变量吗?我在locals()和globals()中都看不到它。
>>> 'abc'
'abc'
>>> len(_)
3
>>>
我不明白这个单下划线是什么意思。它是一个魔法变量吗?我在locals()和globals()中都看不到它。
>>> 'abc'
'abc'
>>> len(_)
3
>>>
_
代表最后一个返回的值--在调用len(_)
时,_
的值是'abc'
。>>> 10
10
>>> _
10
>>> _ + 5
15
>>> _ + 5
20
这由sys.displayhook
处理,_
变量与像int
和sum
这样的内容一起进入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._
将再次可见)。
_
变量应被用户视为只读。不要显式地给它赋值,否则你将创建一个独立的本地变量,掩盖了具有其魔法行为的内置变量。 - RBT为什么你看不到它?它在__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__
的成员在任何模块中都可以使用。
gettext.install
将绑定到 __builtins__.__
,因此可以在整个应用程序中不导入即可使用;因此是同一种“魔法”名称。 - u0b34a0f6ae