Python中使用下划线_作为变量名
彼得·诺维格写了一篇文章,介绍了一种解决数独难题的程序,这个程序能够解决即使是最难的数独,通过结合确定性的逻辑操作和聪明的遍历可能的解法。后者是通过递归实现的;这里是那个函数的代码(来源):
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 的最佳方式;-)