在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_。