68

この関数を 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

なんで?この関数の何が問題になっていますか?

4

3 に答える 3

105

Python インタープリターは、最後の式の値を に割り当てます_

この動作はREPL インタープリターのみに限定されており、インタラクティブなコーディング セッションを支援することを目的としています。

>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0

ただし、標準のPython インタープリターは、ユーザー定義の値を踏みにじらないようにある程度の努力をしています。自分で何かのものを割り当てた場合_、インタープリターはそれを上書きしません (技術的に言えば、_変数は__builtin__属性であり、独自の割り当ては「通常の」グローバルです)。ただし、標準の Python インタープリターは使用していません。あなたは IPython を使用していますが、そのインタープリターはそれほど慎重ではありません。

IPythonは、この動作を明示的に文書化しています

次の GLOBAL 変数は常に存在します (上書きしないでください!)。

  • [_](単一のアンダースコア) : Python のデフォルトのインタープリターのように、以前の出力を保存します。

[...]

標準の Python REPL 環境では、何かを割り当てた場合でも、それを再度シャドウするグローバル ( ) を介して、または削除することによって_、最後の式の結果にアクセスできます。__builtins__.__del _

Python インタープリターの外で_は、慣例により、翻訳可能なテキスト関数の名前として使用されます (gettextモジュールを参照してください。外部ツールは、翻訳可能な文字列を抽出するためにその関数を探します)。

また、慣例により_、割り当てターゲットとして使用すると、その値を無視することをコードの読者に伝えます。たとえば[random.random() for _ in range(5)]、5 つのランダムな float 値のリストを生成したりfoo, bar, _ = three_values、タプル割り当てから 3 番目の値を通知したりする場合は使用されません。_が既にgettext機能に使用されている場合は__、同じ目的に使用できます。

于 2013-07-10T20:30:14.180 に答える
31

_はインタプリタの特殊変数で、常に前の式の結果に割り当てられます。ですから、そのように使用するべきではありません。

ところで、コードは通常の Python シェルで正常に動作するため、問題は IPython シェルに関連しているようです。

通常の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のドキュメントから:

次の GLOBAL 変数は常に存在します (上書きしないでください!)。

_ : (単一のアンダースコア) : Python のデフォルト インタープリターのように、以前の出力を格納します。..

python docsから:

特別な識別子_は、対話型インタープリターで最後の評価の結果を格納するために使用されます。モジュールに格納され __builtin__ます。対話モードでない場合、_特別な意味はなく、定義されていません。

: この名前_は、国際化と組み合わせて使用​​されることがよくあります。この規則の詳細については、gettext モジュールのドキュメントを参照してください。

于 2013-07-10T20:30:06.367 に答える
-1

「_」に割り当てられた変数を作成すると、システム変数_がマスクされます/マスクされます。

于 2013-07-10T20:38:25.557 に答える