在Python / IPython解释器中为单个下划线_赋值


69

我在Python 2.7中使用ipython以下命令创建了此函数:

def _(v):
    return v

以后如果我打电话_(somevalue),我会得到_ = somevalue

in[3]: _(3)
out[3]: 3
in[4]: print _
out[4]: 3

该功能已消失!如果我打电话给_(4)我:

TypeError: 'int' object is not callable`

为什么?此功能有什么问题?



10
@ dimo414:不,这不是该问题的重复。我在我的答案中提到了下划线功能的用法,但这不是OP的要求。这就是为什么Python交互式解释器将其他内容分配给的原因_
马丁·彼得斯

2
您是对的,我意识到在发布可能的重复项之后。由于我们无法撤销闭幕投票,因此我认为离开参考(毕竟,人们当然可以在此页面上寻找链接问题的答案)上的信息多于删除评论。
dimo414 2013年

Answers:


106

Python解释器将最后一个表达式值分配给_

此行为仅限于REPL解释器,并且旨在帮助进行交互式编码会话:

>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0

标准Python解释去一些长度上虽然用户定义的值不踩; 如果您自己分配了其他内容_则解释器不会覆盖该内容(从技术上讲,该_变量是一个__builtin__属性,您自己的分配是“常规”全局变量)。但是,您没有使用标准的Python解释器。您正在使用IPython,并且该解释器不是那么小心。

IPython明确记录了此行为

以下GLOBAL变量始终存在(因此请不要覆盖它们!):

  • [_] (一个下划线):存储先前的输出,例如Python的默认解释器。

[...]

在标准的Python REPL环境中,如果您分配了某些内容,_您仍然可以通过__builtins__._或删除_再次遮蔽它的全局变量来访问最后一个表达式结果del _

_按照惯例,在Python解释器之外,它被用作可翻译文本函数的名称(请参阅gettext模块;外部工具会寻找该函数以提取可翻译字符串)。

而且,按照惯例,将其_用作分配目标会告诉您的代码读者您将忽略该值;例如[random.random() for _ in range(5)]foo, bar, _ = three_values将不使用生成5个随机浮点值的列表,或用信号表示元组分配的第三个值。当_已经用于gettext功能时,__可以用于相同的目的。


什么是交互式编码会话?像教学型的东西?
Stephan

5
@Stephan:不使用脚本打开python解释器,以在REPL提示符下尝试操作。解释器编译语句并立即执行它们,从而使快速尝试某些操作变得容易。
的Martijn Pieters的

31

_是解释器中的特殊变量,它始终分配给先前表达式的结果。因此,您不应该那样使用它。

顺便说一句,问题似乎与IPython Shell有关,因为您的代码在普通python Shell中可以正常工作:

在普通的python shell中,当您向变量分配任何内容时,_它将仅保留分配给该对象,并使其失去特殊的行为。


Python Shell:

>>> 2*2
4
>>> _         #works as expected
4
>>> _ = 2     #after assignment, it's magic functionality is gone
>>> _*5       
10
>>> _
2

IPython外壳

在IPython中,_其行为不同于python shell的行为_;即使您将其分配给某个变量,也将在您进行一些计算后立即对其进行更新。

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的文档中

以下GLOBAL变量始终存在(因此请不要覆盖它们!):

_ :(一个下划线):存储先前的输出,例如Python的默认解释器。..

从python docs

特殊的标识符_在交互式解释器中用于存储上一次评估的结果。它存储在 __builtin__模块中。如果不在交互模式下,_则没有特殊含义且未定义。

注意:该名称_通常与国际化结合使用;有关此约定的更多信息,请参考gettext模块的文档。


尽管我没有安装IPython,但我可以确认这是正常的(官方的CPython?)交互式外壳(在2.7.2版中)如何工作。
2rs2ts 2013年

-1

如果创建分配给“ _”的变量,它将被屏蔽/屏蔽系统变量_。


2
_那可能是什么系统变量?
马丁·彼得斯

同样在这里,我不知道该如何摆脱它
Ahmed C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.