Является ли одно подчеркивание "_" встроенной переменной в Python?

Я не понимаю, что означает это единственное подчеркивание. Это волшебная переменная? Я не вижу его в locals() и globals().

>>> 'abc'
'abc'
>>> len(_)
3
>>> 

Ответ 1

В стандартном REPL Python _ представляет последнее возвращаемое значение - в точке, где вы вызывали len(_), _ было значением 'abc'.

Например:

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

Это обрабатывается sys.displayhook, а переменная _ находится в builtins с такими вещами, как int и sum, поэтому вы не смогли найти его в globals().

Обратите внимание, что такой функции не существует в сценариях Python. В script, _ не имеет специального значения и не будет автоматически задано значение, созданное предыдущим оператором.

Кроме того, остерегайтесь переназначения _ в REPL, если вы хотите использовать его, как указано выше!

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

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

Это создает глобальную переменную, которая скрывает переменную _ во встроенных модулях. Чтобы отменить назначение (и удалить _ из глобальных переменных), вам необходимо:

>>> del _

тогда функциональность вернется в нормальное состояние (снова будет отображаться builtins._).

Ответ 2

Почему вы не можете его увидеть? Он находится в __builtins__

>>> __builtins__._ is _
True

Таким образом, это не глобально, не локально. 1

И где это назначение происходит? 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: я бы назвал его "суперглобальным", так как члены __builtin__ доступны везде, в любом модуле.

Ответ 3

Обычно мы используем _ в Python для привязки функции ugettext.