Python中使用下划线_作为变量名

73 投票
3 回答
47361 浏览
提问于 2025-04-15 16:02

彼得·诺维格写了一篇文章,介绍了一种解决数独难题的程序,这个程序能够解决即使是最难的数独,通过结合确定性的逻辑操作和聪明的遍历可能的解法。后者是通过递归实现的;这里是那个函数的代码(来源):

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

(为了让我的眼睛舒服一些,我在代码中添加了一些空格、换行和制表符;对诺维格博士表示歉意。)

在注释下面,有一行以"_,s"开头。这似乎是一个解包的元组(len(values[s]),s),其中包含了最小的s值。诺维格博士使用"_"作为变量名,是为了表示这是一个“无所谓”的结果,还是有其他的意思?在什么情况下推荐使用"_"作为变量名?在交互模式下,"_"会保存上一个操作的结果;在非交互代码中,有类似的功能吗?

更新

感谢大家的好回答。我想“最佳答案”要归给亚历克斯·马特利,因为他提到“_, vbl_of_interest”这种写法通常是DSU写法的副作用,而DSU本身在很大程度上已经不再必要了。

3 个回答

9

你说得对。在非交互模式下,_没有特别的意思。实际上,Norvig只是想表达他不在乎那个变量的值。

题外话:Norvig的那篇文章写得很好,推荐大家去读一读。

13

你的理解是对的。在交互模式之外,_ 只是用作一个“随便”的变量名,特别是在解包的时候。

76

没错,_ 这个符号在编程中通常用来表示“无所谓”或者“我不在乎”的意思(不过它在国际化方面的用法有点冲突,但那是另一个话题;-)。顺便说一下,在现在的 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,但他用的这种写法是“装饰-排序-去装饰”(DSU)的一种例子,只不过这里用的是最小值而不是排序。而在现在的 Python 中,key= 这个可选参数通常是实现 DSU 的最佳方式;-)

撰写回答