Python 中的 Underscore_as 变量名

Peter Norvig 有一篇文章描述了 解数独游戏的程序,甚至是最难的 解数独游戏的程序,它结合了确定性逻辑运算和可能解的巧妙遍历。后者是递归完成的; 下面是函数(来源) :

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 和标签; 向诺维格博士道歉。)

在评论的正下方有一行以“ _,s”开头。这似乎是未打包的元组(len(values[s]),s) ,其值最小为 s。Norvig 博士使用“ _”作为变量名仅仅是为了表明它是一个“不在乎”的结果,还是有其他原因?是否有时候“ _”被推荐作为一个变量名?在交互模式下,“ _”保存了前面操作的答案; 在非交互代码中是否有类似的函数?

更新

谢谢你的回答。我猜答案是 Alex Martelli 的“附加值”; 他指出“ _,vbl _ of _ interest”这个成语通常是 DSU 成语的一个副作用,而 DSU 成语本身在很大程度上是不必要的。

46949 次浏览

你说得对。在非交互模式下,_没有特殊的意义。事实上,Norvig 只是想表达他并不关心那个变量的值。

题外话: Norvig 写的那篇文章很不错,推荐阅读。

你的解释是正确的。除了交互模式中的特殊含义之外,_只是用作“不在乎”变量名,特别是在解包时。

是的,_是“不在乎”的传统名称(不幸的是,这与它在 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 Peter 是为哪个版本写的,但他使用的成语是“装饰-排序-取消装饰”[[ DSU ]]的一个例子,除了使用 min 代替 sort,在今天的 Python 中,key=可选参数通常是处理 DSU 的最佳方式; ——)。