2013-07-10 22 views
65

に私はipythonではPython 2.7でこの関数を作成し、単一のアンダースコアに値を_割り当てる:は、Python/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` 

なぜですか?この関数の何が問題なのですか?

+0

[Mercurial/Python - Underscore Functionとは何か?](http://stackoverflow.com/questions/3077227/mercurial-python-what-does-the-underscore-function-do) – dimo414

+10

@ dimo414:いいえ、これはその質問の重複ではありません。私は私の答えでアンダースコア関数のその使い方に触れるが、それは** OPが何を求めているのではない**です。これは、なぜPythonインタラクティブインタプリタが何かを '_'に代入した理由です。 –

+1

あなたは正しいです、私は可能な複製を投稿した後にそれを実現しました。私たちは[投票から閉鎖を取り消すことはできません](http://meta.stackexchange.com/questions/915/can-we-have-the-ability-to-rescind-a-close-vote-before-it私はそれがコメントを削除するよりも参照を残してより有益であると思った(人々は確かにリンクされた質問への答えを探してこのページに着陸する可能性があります)。 – dimo414

答えて

101

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

この動作はREPL interpreterに制限され、かつインタラクティブなコーディングセッションを支援するためのものである:

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

標準 Pythonインタプリタはしかし、ユーザー定義の値を踏みつけないように、いくつかの長さになります。 以外を_に割り当てると、インタプリタは上書きしません(技術的には、_ variable is a __builtin__ attributeというあなたの割り当ては「通常の」グローバルです)。あなたは標準のPythonインタプリタを使用していません。あなたはIPythonを使用しており、そのインタプリタはそれほど注意を払っていません。

IPython documents this behaviour explicitly

次のグローバル変数は常に(ので、それらを上書きしないでください!)が存在します。

  • [_](シングルアンダースコア):Pythonのデフォルトのインタプリタのような店前の出力を、 。 Pythonインタプリタの外

[...]

_は、翻訳可能なテキスト機能の名称として使用される規則である(gettext moduleを参照してください。外部ツールは、にその機能を探してください翻訳可能な文字列を抽出する)。

ループ内では、_を割り当てターゲットとしてコードの読者にその値を無視するよう指示します。例えば[random.random() for _ in range(5)]を使用して、5つのランダムな浮動小数点値のリストを生成します。

+0

インタラクティブコーディングセッションとは何ですか?教授型のようなもの? – Stephan

+5

@Stephan:スクリプトを使わずにPythonインタプリタを開いて、REPLプロンプトで試してみましょう。インタプリタは文をコンパイルしてすぐに実行するので、簡単に何かを簡単に試すことができます。 –

+1

@MartijnPieters私は、通常のPythonシェルでは出力が異なるため、問題は 'IPython'シェルに関連していると思います。 –

28

_は、インタプリタの特別な変数です。常に前の式の結果に割り当てられます。だから、そういう使い方はしない。

あなたのコードは、通常の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シェルの_とは動作が異なります。たとえそれをある変数に代入しても、ある計算を行うとすぐに更新されます。 IPythonのdocsから

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 

次のグローバル変数は常に(そう にそれらを上書きしないでください!)が存在します。

_:(シングルアンダースコア):店舗をPythonの デフォルトインタープリタのような以前の出力。 ..パイソンdocsから

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

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

+0

私はIPythonをインストールしていませんが、これは通常の(公式のCPython?)対話シェルが(2.7.2のバージョンで)どのように動作するかを確認できます。 – 2rs2ts

-2

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

+2

システム変数 '_'はどのようなものでしょうか? –

関連する問題