Underscore _ as variable name in Python [duplicate]

非 Y 不嫁゛ 提交于 2019-11-26 03:52:02

问题


This question already has an answer here:

  • What is the purpose of the single underscore “_” variable in Python? 5 answers

Peter Norvig has an essay describing a program to solve sudoku puzzles, even the hardest ones, by combining deterministic logical operations and smart traversal of the possible solutions. The latter is done recursively; here\'s that function (source):

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

(I\'ve added some spaces, CRs, and tabs for the sake of my eyes; apologies to Dr. Norvig.)

Right below the comment there\'s a line starting with \"_,s\". That seems to be the unpacked tuple (len(values[s]),s) with the minimal value of s. Is Dr. Norvig using \"_\" as a variable name just to indicate it\'s a \"don\'t care\" result, or is something else going on? Are there times when \"_\" is recommended as a variable name? In interactive mode, \"_\" holds the answer of the previous operation; is there a similar function in non-interactive code?

Update

Thanks for the good answers. I guess The Answer goes to Alex Martelli for \"value added\"; he points out that the \"_, vbl_of_interest\" idiom is often a side effect of the DSU idiom, which itself has been made largely unnecessary.


回答1:


Yep, _ is a traditional name for "don't care" (which unfortunately clashes with its use in I18N, but that's a separate issue;-). BTW, in today's Python, instead of:

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

you might code

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

(not sure what release of Python Peter was writing for, but the idiom he's using is an example of "decorate-sort-undecorate" [[DSU]] except with min instead of sort, and in today's Python the key= optional parameter is generally the best way to do DSU;-).




回答2:


You are correct. In non-interactive mode _ has no special meaning. Indeed, Norvig just wants to convey that he doesn't care about the value of that variable.

Offtopic: That article by Norvig is very nice. A recommended read.




回答3:


Your interpretation is correct. Outside of the special meaning in interactive mode _ is just used as a "don't care" variable name, especially in unpacking.



来源:https://stackoverflow.com/questions/1739514/underscore-as-variable-name-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!