2017-11-12 4 views
-2

Pythonスコープのドキュメントを調べているうちに、次のコードが出てきましたが、このコードの実行方法はわかりません。誰かがこのコードを説明できますか?Pythonのスコープとネームスペース

def scope_test(): 
    def do_local(): 
     spam = "local spam" 

    def do_nonlocal(): 
     nonlocal spam 
     spam = "nonlocal spam" 

    def do_global(): 
     global spam 
     spam = "global spam" 

    spam = "test spam" 
    do_local() 
    print("After local assignment:", spam) 
    do_nonlocal() 
    print("After nonlocal assignment:", spam) 
    do_global() 
    print("After global assignment:", spam) 

scope_test() 
print("In global scope:", spam) 
+1

ご質問はありますか? – sjaustirni

答えて

0

最も簡単な方法 - プログラムを実行してください! これが出力されます。

After local assignment: test spam 
After nonlocal assignment: nonlocal spam 
After global assignment: nonlocal spam 
In global scope: global spam 

あなたが見ることができるように、ローカル以外が定義された範囲内で優先されます。一旦外に出ると、グローバルな定義が使用されます。グローバル値をリセットする必要はありませんが、これは自動的に行われます。 nonlocalはローカル割り当てを上書きします。

編集:詳細はthis related questionを参照してください。

+0

なぜこれが当てはまるのかまだ分かりません。なぜこれがステップごとに出力されるのかをもっと説明できますか?なぜdo_local()を呼び出すのか、なぜ迷惑メールが変更されないのでしょうか?私たちがdo_global()を呼び出すとき、scope_testの中でなぜそれはまだローカルではありませんが、実際にはスパムはグローバルなスパムになりますか? –

+0

Pythonのドキュメントから: "非ローカルステートメントは、リストされた識別子が、グローバルを除く最も近い囲みスコープ内の以前にバインドされた変数を参照するようにします。"この場合、「最も近い囲みスコープ」はscope_test()関数です。したがって、この関数内では、グローバル値を設定した後でも、非ローカル値を取得します。最後の呼び出しはグローバルスコープからの呼び出しであるため、値はグローバル値です。最初の呼び出しは、フィールドを非ローカルにする前にdo_local()を呼び出すため、ローカル値を取得します。最後にdo_local()をもう一度呼び出すと、ローカル以外の値が返されます。 – Tgilgul

関連する問題