Является ли единственное подчеркивание "_" встроенной переменной в 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.