Underscore _作为Python中的变量名

时间:2009-11-16 00:45:21

标签: python variables naming-conventions metasyntactic-variable

彼得·诺维格(Peter Norvig)通过结合确定性逻辑运算和可能解决方案的智能遍历,撰写了一篇描述program to solve sudoku puzzles甚至是最难的source的文章。后者是递归完成的;这是函数({{3}}):

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]
            )

(为了我的眼睛,我添加了一些空格,CR和标签;向Norvig博士道歉。)

在评论的正下方有一行以“_,s”开头。这似乎是解包的元组(len(values[s]),s),其最小值为s。 Norvig博士是否使用“_”作为变量名称只是为了表明它是“不关心”的结果,还是其他事情正在发生?是否有时候建议将“_”作为变量名?在交互模式中,“_”保留前一操作的答案;在非交互式代码中是否有类似的功能?

更新

感谢您的好答案。我猜答案是Alex Martelli的“增值”;他指出,“_,vbl_of_interest”成语通常是DSU习语的副作用,而这本身就很大程度上是不必要的。

3 个答案:

答案 0 :(得分:68)

是的,_是“不关心”的传统名称(不幸的是它在I18N中的使用发生冲突,但这是一个单独的问题;-)。顺便说一句,在今天的Python中,而不是:

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

你可以编码

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

(不确定Python正在撰写的Python版本是什么,但他使用的成语是“decorate-sort-undecorate”[[DSU]]的一个例子,除了min而不是sort,在今天的Python中{{{ 1}}可选参数通常是做DSU的最佳方式; - )。

答案 1 :(得分:9)

你是对的。在非交互模式下,_没有特殊含义。实际上,Norvig只是想传达他并不关心那个变量的价值。

Offtopic:Norvig的那篇文章非常好。建议阅读。

答案 2 :(得分:9)

您的解释是正确的。除了交互模式_中的特殊含义之外,它仅用作“不关心”变量名称,尤其是在解包时。