2012-02-26 13 views
1

私は関数環境(グローバル、ローカル)を理解しようとしています。Pythonの関数環境を理解しようとしています

def g(x): 
    print(x) 

def f(f): 
    f(1) 

f(g) 

誰かがこの概念で私を助けてください:すでに例えば、グローバルに定義されたネストされた関数がある場合には具体的には、私は非常に混乱しますか?私は大いに感謝します。

ありがとうございました。

+4

「私は非常に混乱しています」とは何ですか?混乱していることは何ですか? "このコンセプトで私を助けてください"?あなたが何をするのを助けますか?何を理解するのを助けますか?どの部分が混乱しているかを明確にする必要があります。これを '>>>'プロンプトで実行すると、どうなりますか? –

+1

"今後の質問"?なぜ待つ?今すぐこの問題を修正することができます。それは、同様の混乱を起こしている人を助けるかもしれません。混乱していることを説明するために今すぐ質問を更新するのは誰でも助けになります。 –

答えて

4

Pythonは辞書を使用してローカル変数とグローバル変数を保持します。変数参照を参照すると、まずローカル辞書が検索されます。グローバルディクショナリ内の変数を参照する場合は、globalキーワードをその前に置きます。

thisの回答もご覧ください。

0

私はuser18044に同意しますが、 'f(f)'に関する混乱はありますか?私は本当に混乱する可能性があることに同意します。 'f'への引数は、名前が 'f'のローカル型スコープを持つ関数ハンドルです。どのような 'f'が使用されるかをPythonが決定する方法は、18044で説明されています。Pythonは関数定義上で名前 'f'を調べ、ローカルパラメータ 'f'はグローバル名 'f'関数内にグローバル変数「dude」とローカル変数「dude」がありました。ローカルはグローバルを上書きします。これが役立ち、意味をなされることを願っています。 :-)

+0

はい、私の混乱はf(f)についてです!それは直感的ではなく、意味的には、ローカルがグローバルに取って代わるものと思われます。これは助けになります、どうもありがとうございます。 – bmacri

+0

@ Code_Phoenix:混乱していることを正確に説明するために、** **アップデート**してください。回答のコメントとしてインポート情報を追加しないでください。 **更新**の質問をしてください。 –

+0

グローバルなグローバル置換は、スコープの概念を持つすべての言語での通常の動作です。それが範囲です。局所的に定義する*正確な理由*は、局所的に有用である可能性が高いため(あるいはむしろ、そうではないと考えるべきであるため)、「ローカル」で定義されたものよりも「外部」から何かを参照する方が多くの努力が必要です。他の場所で使用することができます)。 –

0

関数のローカルは、渡されたすべての変数と、明示的にタグ付けされていない変数global(または3.xのnonlocal)で構成されるすべての変数で構成されます。

グローバルは、グローバルスコープで見ることのできるすべてのもの(関数自体を含む)で構成されています。

名前が参照されると、まず地域で検索され、地域で見つからない場合はグローバルに検索されます。

ステートメントf(g)が実行されると、ステートメント自体はグローバルスコープにあるため、ローカルはありません。 fgはどちらもグローバルにあります。両方とも関数です。 def g...で定義された関数が引数として渡され、def f...で定義された関数が呼び出されます。

f(f)が実行されている場合、fは機能のローカルにあります。渡された値にバインドされます。これはdef g...で定義された関数です。関数本体にはf(1)というステートメントがあります。 1は定数であり、ルックアップは必要ありません。地元でfが検索され、渡された関数が見つかりました。それは、グローバルスコープで知られている関数であるgと呼ばれています。

したがって、gは、同様にローカル変数xにバインドされた値1で実行されます。これは、print(3.xでは2.xではprintがキーワードなので、print xはステートメントです)に転送され、値1が出力されます。

関連する問題