在Python / IPython解释器中为单个下划线_赋值
我使用ipython
在Python 2.7中创build了这个函数:
def _(v): return v
后来如果我叫_(somevalue)
,我得到_ = somevalue
。
in[3]: _(3) out[3]: 3 in[4]: print _ out[4]: 3
该function已经消失! 如果我打电话给_(4)
我会得到:
TypeError: 'int' object is not callable`
为什么? 这个function有什么问题?
Python解释器将最后一个expression式值赋给_
。
此行为仅限于REPL解释器 ,旨在协助交互式编码会话:
>>> import math >>> math.pow(3.0, 5) 243.0 >>> result = _ >>> result 243.0
标准的 Python解释器有一定的长度,但不能践踏用户定义的值; 如果你自己指定了其他的东西 ,那么解释器不会覆盖它(从技术上讲, _
variables是一个__builtin__
属性 ,你自己的任务是“常规”全局variables)。 你虽然没有使用标准的Python解释器, 你正在使用IPython,那个解释器并不那么小心。
IPython 明确地logging了这种行为 :
以下GLOBALvariables总是存在的(所以不要覆盖它们):
[_]
(单个下划线):存储以前的输出,如Python的默认解释器。[…]
在Python解释器之外,通常将_
用作可翻译文本函数的名称(请参阅gettext
模块 ;外部工具查找该函数以提取可翻译的string)。
在循环中,使用_
作为赋值目标告诉读者你的代码将会忽略这个值; 例如[random.random() for _ in range(5)]
来生成5个随机浮点值的列表。
_
是解释器中的一个特殊variables,它总是被分配给前一个expression式的结果。 所以,你不应该那样使用它。
顺便说一句,这个问题似乎与IPython shell有关,因为你的代码在普通的python shell中工作正常:
在正常的python shell中,当你给variables_
赋值的时候,它只会被赋值给那个对象,并且会丢失它的特殊行为。
Python shell:
>>> 2*2 4 >>> _ #works as expected 4 >>> _ = 2 #after assignment, it's magic functionality is gone >>> _*5 10 >>> _ 2
IPythonshell :
在IPython中_
行为与python shell的不同_
; 即使你把它分配给一些variables,那么一旦你做了一些计算,它也会被更新。
In [1]: 2*2 Out[1]: 4 In [2]: _ Out[2]: 4 In [3]: _ = 10 In [4]: _*10 Out[4]: 100 In [5]: _ Out[5]: 100
从IPython的文档 :
以下GLOBALvariables总是存在的(所以不要覆盖它们):
_ :(单个下划线):存储以前的输出,如Python的默认解释器。 ..
从python 文档 :
交互式解释器中使用特殊标识符
_
来存储上次评估的结果; 它存储在__builtin__
模块中。 当不处于交互模式时,_
没有特殊含义,没有定义。注 :名称
_
通常与国际化结合使用; 有关此约定的更多信息,请参阅gettext模块的文档。
如果你创build一个分配给“_”的variables,它将被屏蔽/屏蔽系统variables_。