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

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

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

3 ответа

Решение

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

Например:

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

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

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

Также остерегайтесь переназначения _ в 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._ будет видно снова).

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

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

Другие вопросы по тегам