分配给“_”的原因

时间:2011-02-01 07:13:46

标签: python programming-languages syntax idioms

我在一些情况下已经看到了这一点,例如,

按顺序拆包:

_, x = L.pop()  # e.g., L is a list of tuples

初始化容器:

X = _

显然,这不是正式python语法的一个元素,而是我所知道的用途似乎是自由裁量的。

所以我很好奇使用它的可能原因是什么?一般来说有什么优势(如果有的话)?

注意 :我的问题与在脚本,模块等中使用“_”有关,但 不是 < / strong>在交互式提示下使用它。在 IDLE 中,使用python打包的交互式解释器以及 ipython ,“_”中的交互式解释器用作最近返回的结果的占位符)。

5 个答案:

答案 0 :(得分:32)

我看过它有两种用途。两者都是一个抛弃变量,但更常见的是作为国际化的文本包装。

丢弃变量

name, _ = 'bida.bombu.foo'.split('.', 1)

虽然我不推荐这个。称之为“忽略”。

name, ignored = 'bida.bombu.foo'.split('.', 1)

更清楚。

i18n wrapper

from zope.i18nmessageid import MessageFactory
_ = MessageFactory('my.domain')

label = _("The label text")

label这里将是一个“消息”,一个具有消息ID和域的对象,当呈现给用户界面(如网页)时,它将被翻译成当前用户语言消息目录,以便标签以用户的本地语言结束。

_在这里使用是因为它短而不引人注目。结果代码_("The label text")看起来与字符串不同,而MyDomainMessage("The label text")看起来非常不同,而且时间也长得多。

答案 1 :(得分:7)

优点是它是一个单一的角色而且是“无名的”。

缺点是它常用于I18N,作为对gettext.gettext()的引用。

答案 2 :(得分:5)

_是一个有点特殊的变量名。在shell中,它包含先前计算的表达式的值:

>>> 1+2
3
>>> _+4
7

在脚本中,它通常用作一次性变量,i。即出于语义原因需要的,但以后不会使用。从语法上讲,它只是一个与其他变量一样的变量。

答案 3 :(得分:3)

我看到变量_在你不关心它会得到什么价值时使用,或多或少像/dev/null变量。

在python哲学中,可读性比其他语言更有价值,例如:

x, y, _, w = getPoint()

比其他替代方案更紧凑,更易读,表明您不关心结果的z坐标。其他用途可能是

for _ in xrange(10):
    print "Hello, world."

def matrix(rows, columns):
    return [[0] * columns for _ in xrange(rows)]

对于语言_确实是一个有效的标识符,即使在某些交互式python循环中它具有特殊含义。

这种用作“匿名变量”的频率并不常见,但仍然存在,因此您可以在现有代码中找到它。例如,PyChecker不会报告上述matrix函数的任何内容,但如果您使用“普通”变量名称,它会抱怨。

但也有一些软件包可以为_提供明确定义的含义(gettext)。

答案 4 :(得分:-2)

在脚本中使用_没有充分的理由。在使用交互式解释器时,如果您正在进行任何数学计算,并且您想要前一个表达式的结果,则可以使用_。 Python教程在同一个上下文中介绍了_。我发现行为是从某些shell行为中延续出来的。

在你的例子中:

_, x = L.pop()

会失败,因为L.pop()会返回一个值而你不能将它分配给两个变量,而且将值赋给具有特殊含义的_也不是一个好主意。