Is the single underscore "_" a built-in variable in Python?

Question:

I don’t understand what this single underscore means. Is it a magic variable? I can’t see it in locals() and globals().

>>> 'abc'
'abc'
>>> len(_)
3
>>> 
Asked By: thebat

||

Answers:

In the standard Python REPL, _ represents the last returned value — at the point where you called len(_), _ was the value 'abc'.

For example:

>>> 10
10
>>> _
10
>>> _ + 5
15
>>> _ + 5
20

This is handled by sys.displayhook, and the _ variable goes in the builtins namespace with things like int and sum, which is why you couldn’t find it in globals().

Note that there is no such functionality within Python scripts. In a script, _ has no special meaning and will not be automatically set to the value produced by the previous statement.

Also, beware of reassigning _ in the REPL if you want to use it like above!

>>> _ = "underscore"
>>> 10
10
>>> _ + 5

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    _ + 5
TypeError: cannot concatenate 'str' and 'int' objects

This creates a global variable that hides the _ variable in the built-ins. To undo the assignment (and remove the _ from globals), you’ll have to:

>>> del _

then the functionality will be back to normal (the builtins._ will be visible again).

Answered By: Mark Rushakoff

Why you can’t see it? It is in __builtins__

>>> __builtins__._ is _
True

So it’s neither global nor local. 1

And where does this assignment happen? sys.displayhook:

>>> import sys
>>> help(sys.displayhook)
Help on built-in function displayhook in module sys:

displayhook(...)
    displayhook(object) -> None

    Print an object to sys.stdout and also save it in __builtin__.

1 2012 Edit : I’d call it “superglobal” since __builtin__‘s members are available everywhere, in any module.

Answered By: u0b34a0f6ae

Usually, we are using _ in Python to bind a ugettext function.

Answered By: Natim
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.