当前位置: 代码迷 >> 综合 >> python _ underscore variable
  详细解决方案

python _ underscore variable

热度:75   发布时间:2024-01-11 01:55:46.0

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

up vote 210 down vote favorite
68

What is the meaning of _ after for in this code?

if tbh.bag:n = 0for _ in tbh.bag.atom_set():n += 1
share improve this question
 
5  
See stackoverflow.com/questions/1739514/as-variable-name-in-python –  kennytm  May 5 '11 at 5:46
10  
While this question is marked as a duplicate, it and it's answers are a much better discussion of the problem than the question it allegedly duplicates. –  Zags  Oct 17 '13 at 20:54
 
For your case, it would be cleaner to either len(tbh.bag.atom_set()) (if the returned value has a __len__ method) or sum(1 for _ in tbh.bag.atom_set()) –  Nick T  Apr 5 at 20:08

2 Answers

active oldest votes
up vote 314 down vote accepted

_ has 3 main conventional uses in Python:

  1. To hold the result of the last executed statement in an interactive interpreter session. This precedent was set by the standard CPython interpreter, and other interpreters have followed suit
  2. For translation lookup in i18n (imported from the corresponding C conventions, I believe), as in code like: raiseforms.ValidationError(_("Please enter a correct username"))
  3. As a general purpose "throwaway" variable name to indicate that part of a function result is being deliberately ignored, as in code like: label, has_label, _ = text.partition(':')

The latter two purposes can conflict, so it is necessary to avoid using _ as a throwaway variable in any code block that also uses it for i18n translation (many folks prefer a double-underscore, __, as their throwaway variable for exactly this reason).

share improve this answer
 
9  
Could you explain how it works in a function call, for example: raise forms.ValidationError(_("Please enter a correct username")). I've seen this in Django code, and it's not clear what's going on. –  John C  May 19 '11 at 13:43
17  
That is usage 2 - by convention, _ is the name used for the function that does internationalisation and localisation string translation lookups. I'm pretty sure it is the C gettext library that established that convention. –  ncoghlan  May 19 '11 at 16:47 
13  
FWIW, I've personally started using __ (a double underscore) as my general purpose throwaway variable to avoid conflicting with either of the first two use cases. –  ncoghlan  Mar 20 '12 at 6:35
 
This use of a single _ as a variable name for a throwaway variable isn't mentioned in PEP 8. Do you know of an authoritative source that suggests using it for that purpose? –  martineau  Jun 23 '15 at 19:30
4  
Emergent community conventions don't tend to have authoritative sources - just observations of the practices that have appeared over time. FWIW, I'm one of the co-authors of more recent PEP 8 updates, and my answer is based on the 3 different ways I've seen _ used as a variable name since I started using Python professionally in 2002. –  ncoghlan  Jun 28 '15 at 3:54
 
Thanks for the answer. Anyway I do not understand the advantage of marking a variable as not used. On the contrary, since one of the goals of Python is to let you make readable code, IMHO the use of the underscore character as variable or function name is not a good idea. –  Marco Sulla  Feb 25 at 13:18 
1  
The convention is mainly for tuple unpacking: a, __, c = iterable tells the reader immediately that we're unpacking a 3-tuple, but only using the first and last values. If we instead write a, b, c = iterable, the reader (or an automated code linter) can reasonably expect all of ab, and c to be used later (and if they're not, it may be a sign of a bug somewhere). –  ncoghlan  Feb 29 at 7:42
 
Based on the comments, I've now added examples for usages 2 & 3 directly to the answer. –  ncoghlan  Feb 29 at 7:55
up vote 94 down vote

It's just a variable name, and it's conventional in python to use _ for throwaway variables. It just indicates that the loop variable isn't actually used.

share improve this answer
 
3  
you mean it doesn't represent the last returned value? –  alwbtc  May 5 '11 at 5:52
16  
@steve only in a python shell –  Gabi Purcaru  May 5 '11 at 5:55
 
similar to the use of _ in Prolog –  Matthias  Feb 23 at 9:19


favorite
20

This question already has an answer here:

  • What is the purpose of the single underscore “_” variable in Python? 2 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 earlierif 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.

share improve this question

marked as duplicate by poke python Nov 12 '14 at 20:48

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

 
 
Another very popular solution nowadays is to get rid of the _ and just put [1] after the method call to project out the wished results. –  Trilarion  May 20 '14 at 8:25

3 Answers

active oldest votes
up vote 49 down vote accepted

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;-).

share improve this answer
 
 
Hi, Alex. I was wondering about that, but I hadn't put it into the right concept --- and might not have, without your comment. BTW, my sudoku solver I wrote 4 years ago did a lot of DSU-ing, so you are pointing out places where I ought to update the coding. (Not to mention that I'm still trying to understand how the thing works!!) Typically, my code sets up its own explicit stack, rather than going recursive. –  behindthefall  Nov 16 '09 at 0:58
 
@behindthefall, controlling your own stack is just fine, though recursion's simpler -- there are specific techniques for recursion removal (not really germane to this question, but, do ask another)!. The one major case where manual DSU is still needed in today's Python, in my experience, is priority queues (heapq's function don't accept key= -- neither do bisect's, but that's not quite as common a use case for me as priority queues;-). –  Alex Martelli  Nov 16 '09 at 1:33
 
I'm trying to put recursion IN so that I can remove it when I wish --- my head hasn't learned how to do stuff with recursion that it wouldn't rather do with a loop. There's a load of code in my sudoku solver that this "simple" recursive def makes all go away! Dr. Norvig chose to use string ops rather than set ops in his solver; ironically, I used string ops to solve a few tiling puzzles before I tackled sudoku, so I used lists 'n' sets for sudoku just for the experience. –  behindthefall  Nov 16 '09 at 1:44
 
@behindthefall, yes, starting with recursion is generally best (simplest). Not sure what to suggest to help "getting" recursion, maybe a language-agnostic question would elicit responses from other people more experienced than me in such "teaching" issues! –  Alex Martelli  Nov 16 '09 at 1:56
 
Will the compiler recognize that '_' is thrown away and not actually assigning it (saving performance)? –  Viktor Mellgren  Jul 3 '12 at 8:15
up vote 8 down vote

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.

share improve this answer
 
1  
Ah, very useful. Of course, doctests run in "interactive" mode: and tromp all over _ when you're trying to use it for i18n... –  Auspex  Oct 7 '14 at 22:34
up vote 6 down vote

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.

share improve this answer


favorite
20

This question already has an answer here:

  • What is the purpose of the single underscore “_” variable in Python? 2 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 earlierif 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.

share improve this question

marked as duplicate by poke python Nov 12 '14 at 20:48

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

 
    
Another very popular solution nowadays is to get rid of the _ and just put [1] after the method call to project out the wished results. –  Trilarion  May 20 '14 at 8:25

3 Answers

active oldest votes
up vote 49 down vote accepted

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;-).

share improve this answer
 
    
Hi, Alex. I was wondering about that, but I hadn't put it into the right concept --- and might not have, without your comment. BTW, my sudoku solver I wrote 4 years ago did a lot of DSU-ing, so you are pointing out places where I ought to update the coding. (Not to mention that I'm still trying to understand how the thing works!!) Typically, my code sets up its own explicit stack, rather than going recursive. –  behindthefall  Nov 16 '09 at 0:58
    
@behindthefall, controlling your own stack is just fine, though recursion's simpler -- there are specific techniques for recursion removal (not really germane to this question, but, do ask another)!. The one major case where manual DSU is still needed in today's Python, in my experience, is priority queues (heapq's function don't accept key= -- neither do bisect's, but that's not quite as common a use case for me as priority queues;-). –  Alex Martelli  Nov 16 '09 at 1:33
    
I'm trying to put recursion IN so that I can remove it when I wish --- my head hasn't learned how to do stuff with recursion that it wouldn't rather do with a loop. There's a load of code in my sudoku solver that this "simple" recursive def makes all go away! Dr. Norvig chose to use string ops rather than set ops in his solver; ironically, I used string ops to solve a few tiling puzzles before I tackled sudoku, so I used lists 'n' sets for sudoku just for the experience. –  behindthefall  Nov 16 '09 at 1:44
    
@behindthefall, yes, starting with recursion is generally best (simplest). Not sure what to suggest to help "getting" recursion, maybe a language-agnostic question would elicit responses from other people more experienced than me in such "teaching" issues! –  Alex Martelli  Nov 16 '09 at 1:56
    
Will the compiler recognize that '_' is thrown away and not actually assigning it (saving performance)? –  Viktor Mellgren  Jul 3 '12 at 8:15
up vote 8 down vote

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.

share improve this answer
 
1  
Ah, very useful. Of course, doctests run in "interactive" mode: and tromp all over _ when you're trying to use it for i18n... –  Auspex  Oct 7 '14 at 22:34
up vote 6 down vote

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.

share improve this answer
  相关解决方案