Underscore _作为Python中的变量名

Underscore _ as variable name in Python

本问题已经有最佳答案,请猛点这里访问。

彼得·诺维格(PeterNorvig)在一篇文章中描述了一个程序,通过结合确定性逻辑运算和对可能的解的智能遍历来解决数独问题,即使是最难的问题。后者是递归完成的;下面是函数(源代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def search(values):
   "Using depth-first search and propagation, try all possible values."
    if values is False:
        return False ## Failed earlier
    if all( len( values[s]) == 1 for s in squares):
        return values ## Solved!
    ## Chose the unfilled square s with the fewest possibilities
    _,s = min( (len( values[s]), s)
                for s in squares
                if len(values[s]) > 1
            )
    return some( search( assign( values.copy(), s, d))
                for d in values[s]
            )

(为了我的眼睛,我添加了一些空格、CRS和制表符;向诺维格博士道歉。)

在评论的正下方有一行以"_,s"开头。这似乎是最小值为s的未封装元组(len(values▼显示),s)。诺维格博士是用"EDOCX1"〔3〕作为变量名来表示这是一个"不在乎"的结果,还是有别的事情发生?是否有时建议将"_作为变量名?在交互模式下,"_持有上一个操作的答案;非交互代码中是否有类似的功能?

更新

谢谢你的回答。我猜亚历克斯·马泰利的回答是"增值",他指出,"感兴趣的vbl"成语通常是DSU成语的副作用,而DSU成语本身就被认为是不必要的。


是的,_是"不在乎"的传统名称(不幸的是,它与i18n中的用法冲突,但这是一个单独的问题;-)。顺便说一句,在今天的python中,不是:

1
2
3
4
_,s = min( (len( values[s]), s)
            for s in squares
            if len(values[s]) > 1
        )

你可以编码

1
2
s = min((s for s in squares if len(values[s])>1),
        key=lambda s: len(values[s]))

(不确定是什么版本的python peter编写的,但是他使用的习惯用法是"decorate sort undecorate"[[dsu]]的一个例子,除了使用min而不是sort,在今天的python中,key=可选参数通常是执行dsu的最佳方法;-)。


你的解释是正确的。在交互模式中,除了特殊意义之外,_只是用作"不关心"变量名,特别是在解包中。


你是对的。在非交互模式下,_没有特殊意义。实际上,诺维格只是想表达他并不关心这个变量的值。

offtic:norvig的那篇文章非常好。建议阅读。.