この関数はPython 2.7 with 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`
_
どうして?この関数の何が問題になっていますか?
Pythonインタープリターは、最後の式の値を_
に割り当てます。
この動作は REPLインタープリター のみに制限されており、インタラクティブなコーディングセッションを支援することを目的としています。
>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0
standardPythonインタープリターは、ユーザー定義の値を踏みにじらないようにある程度の長さになります。自分で何かを割り当てた場合elseを_
にすると、インタプリタはそれを上書きしません(技術的に言えば、 _
変数は__builtin__
属性です 、独自の割り当て標準のPythonインタープリターを使用していませんが、IPythonを使用しており、そのインタープリターはそれほど注意深くありません。
IPython この動作を明示的に文書化します :
次のグローバル変数は常に存在します(したがって、それらを上書きしないでください!):
[_]
(単一のアンダースコア):Pythonのデフォルトのインタープリターのように、以前の出力を格納します。[...]
標準のPython REPL環境では、_
に何かを割り当てた場合でも、__builtins__._
を介して、またはそれをシャドウする_
グローバルを削除することで、最後の式の結果にアクセスできます。再び(del _
)。
Pythonインタープリターの外では、_
は慣例により、翻訳可能なテキスト関数の名前として使用されます( gettext
モジュールを参照 ;外部ツールは翻訳可能な文字列を抽出する関数)。
また、慣例により、割り当てターゲットとして_
を使用すると、コードの読者にその値を無視することが通知されます。例えば5つのランダムなfloat値のリストを生成するための[random.random() for _ in range(5)]
、またはタプル割り当てから3番目の値を通知するためのfoo, bar, _ = three_values
は使用されません。 _
がすでにgettext
関数に使用されている場合、__
は同じ目的で使用できます。
_
はインタプリタの特別な変数であり、常に前の式の結果に割り当てられます。だから、あなたはそれをそのように使うべきではありません。
ところで、この問題はIPython Shellに関連しているようです。これは、コードが通常のpython Shell:
通常のpythonシェルで変数_
に何かを割り当てると、そのオブジェクトのみに割り当てられたままになり、特別な動作が失われます。
Pythonシェル:
>>> 2*2
4
>>> _ #works as expected
4
>>> _ = 2 #after assignment, it's magic functionality is gone
>>> _*5
10
>>> _
2
IPythonシェル:
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のデフォルトのインタープリターのように、以前の出力を格納します。 ..
From python docs :
特別な識別子
_
は、最後の評価の結果を格納するために対話型インタプリタで使用されます。__builtin__
モジュールに保存されます。インタラクティブモードでない場合、_
には特別な意味はなく、定義されていません。注:
_
という名前は、国際化と組み合わせて使用されることがよくあります。この規則の詳細については、gettextモジュールのドキュメントを参照してください。