2017-09-21 18 views
1
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) 

こんにちは、私はPythonクラスを扱っており、上記の例を公式の文書に当てています。範囲について:グローバルおよびローカル割り当て

出力:ローカル割り当てた後

:ローカル以外の割り当て後のテストスパム

:グローバル割り当てた後、ローカル以外のスパム

:グローバルな範囲で非ローカルスパム

:グローバルスパム

do_localの後の最初の印刷の結果は、まだ "テストスパム"を出力しますが、2番目の印刷が "非ローカルスパム"を出す理由は分かりません。

どのような違いがありますか?

do_local()を実行すると、do_local()が実行され、spam変数が「ローカルスパム」として変更され、do_nonlocal()と同じように動作して「非ローカルスパム」になる可能性があります。しかし、そうではありません。

なぜですか?ここで

+0

um、それは第2のケースでは「非ローカル」ですか? –

+0

@DavisHerring Yep – delinco

答えて

1

は(hereから)グローバル変数の例です。この例では見ることができるように

globvar = 0 

def set_globvar_to_one(): 
    global globvar # Needed to modify global copy of globvar 
    globvar = 1 

def print_globvar(): 
    print(globvar)  # No need for global declaration to read value of globvar 

set_globvar_to_one() 
print_globvar()  # Prints 1 

グローバルは、スクリプト内の任意の場所で利用可能な変数を意味します。関数内でグローバル変数を定義または変更する場合は、グローバルというキーワードで別の関数で使用できます。

も、あなたは一例では、この最初のdefiniton行を削除することができます。それは、グローバル変数としてとにかく働く

globvar = 0 

。したがって、グローバルキーワードを使用すると、スクリプト内のどのスコープでも使用できます。 Pythonの3 here

から

非ローカル定義は、外側が、非グローバル、スコープで 変数に割り当てることができますローカル以外のキーワードを導入しました。

つまり、ローカル以外のキーワードを使用すると、それは外側のスコープになります。この状況では、do_nonlocal()関数の "nonlocal spam"はscope_test()関数でも利用できますが、もう一つのスコープは使用できません。

あなたはグローバル非ローカルキーワードを使用しない場合は、機能に「スパム」を定義し、それは関数が終わったときに削除されるだけでローカル変数です。

EDIT

これは、同じコードではなく、同じ結果を印刷します。理解を深めるためには、次のような状況になります。

spam_1 = "" 

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

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

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

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

scope_test() 
print("In global scope:", spam_1) 
関連する問題