Присваивая значение одного символа подчеркивания в интерпретаторе Python/IPython соответствовало
Я создал эту функцию в Python 2.7 с ipython:
def _(v):
return v
позже, если я называю _(somevalue), Я _ = somevalue.
in[3]: _(3)
out[3]: 3
in[4]: print _
out[4]: 3
функция исчезла! Если я позвоню _(4) Я:
TypeError: 'int' object is not callable`
почему? Что не так с этой функцией?
3 ответов:
интерпретатор Python присваивает последнее значение выражения
_.это поведение ограничено REPL переводчик только, и предназначен для оказания помощи в интерактивных сеансах кодирования:
>>> import math >>> math.pow(3.0, 5) 243.0 >>> result = _ >>> result 243.0The стандартный интерпретатор Python идет на некоторую длину, чтобы не топтать определенные пользователем значения; если вы сами назначаете что-то другое до
_тогда интерпретатор не будет перезаписывать это (технически говоря,_переменная__builtin__атрибут, ваши собственные задания являются "обычными" глобалами). Однако вы не используете стандартный интерпретатор Python; вы используете IPython, и этот интерпретатор не так осторожен.IPython документы это поведение явно:
следующие глобальные переменные всегда существуют (так что не перезаписывайте их!):
[_](один подчеркивание): сохраняет предыдущий вывод, например интерпретатор Python по умолчанию.[...]
вне интерпретатора Python,
_по соглашению используется в качестве имени переводимой текстовой функции (см.gettextмодуль; внешние инструменты искать эту функцию для извлечения переводимых строк).в петли, используя
_как цель назначения сообщает читателям вашего кода, что вы собираюсь игнорировать это значение, например[random.random() for _ in range(5)]создать список из 5 случайных значений с плавающей точкой.
_- это специальная переменная в интерпретаторе, она всегда присваивается результату предыдущего выражения. Так что тебе не стоит так его использовать.кстати проблема, похоже, связана с оболочкой IPython, потому что ваш код отлично работает в обычной оболочке python:
в обычной оболочке python, когда вы назначаете что-либо переменной
_тогда он останется назначенным только этому объекту и потеряет его особое поведение.
Python оболочка:
>>> 2*2 4 >>> _ #works as expected 4 >>> _ = 2 #after assignment, it's magic functionality is gone >>> _*5 10 >>> _ 2
IPython shell:
В IPython
_ведет себя иначе, чем python оболочки_; даже если вы назначите его какой-то переменной, то он также будет обновляться, как только вы сделаете некоторые вычисления.In [1]: 2*2 Out[1]: 4 In [2]: _ Out[2]: 4 In [3]: _ = 10 In [4]: _*10 Out[4]: 100 In [5]: _ Out[5]: 100
С оболочкой IPython это docs:
следующие глобальные переменные всегда существуют (поэтому не перезаписывайте они!):
_ : (одно подчеркивание): сохраняет предыдущий вывод, например Python интерпретатор по умолчанию. ..
от python docs:
специальный идентификатор
_используется в интерактивном интерпретаторе для сохранить результат последней оценки; он хранится в__builtin__модуль. Когда не в интерактивном режиме,_не имеет особого значения и не определяется.Примечание имя
_часто используется в сочетании с интернационализацией; см. документацию для gettext модуль для получения дополнительной информации об этой конвенции.
Comments