2017-01-21 30 views
0

次のコードをPython3.4で実行しようとしていますが、エラーが発生しています。関数内の関数内の変数にアクセスする方法

def checknumner(): 
    i = 0 
    print("checknumber called...") 
    def is_even(): 
     print("is_even called...") 
     global i 
     if i % 2 == 0: 
      print("Even: ", i) 
     else: 
      print("Odd: ", i) 
     i += 1 
    return is_even 

c = checknumner() 
print(c()) 
print(c()) 
print(c()) 

サブ関数の変数 "i"にアクセスできません。私は "グローバルI" なステートメント

D:\Study\Python>python generator_without_generator.py checknumber called... is_even called... Traceback (most recent call last): File "generator_without_generator.py", line 24, in <module> 
    print(c()) File "generator_without_generator.py", line 16, in is_even 
    if i % 2 == 0: NameError: name 'i' is not defined 

を追加すると、私は "グローバルI" なステートメント

D:\Study\Python>python generator_without_generator.py checknumber called... is_even called... Traceback (most recent call last): File "generator_without_generator.py", line 24, in <module> 
    print(c()) File "generator_without_generator.py", line 16, in is_even 
    if i % 2 == 0: UnboundLocalError: local variable 'i' referenced before assignment 

をコメントアウト

は、誰もがこれを説明していただけますか?

答えて

3

あなたは、Python 3を(そしてあなたがいるように見える)を使用している場合は、この問題に取り組むための素晴らしい方法があります:ここでは

def function(): 
    i = 0 
    def another_function(): 
     nonlocal i 
     # use 'i' here 

、それが定義されていただろうとiがグローバルではありません外部両方の機能がある場合はです。また、外側に定義されているように、another_functionではローカルではありません。したがって、ローカルではないです。

+0

はなぜ '全く必要nonlocal'で約nonlocal

詳細情報?あなたの例でも、これは単なるクロージャです。つまり、内部関数は外部関数で定義された変数にアクセスできます。 –

+0

EDIT:参照エラーを引き起こす行は 'i + = 1'ですが、反復呼び出しでも' i'は決して増加しませんし、 'i'でもクロージャのスコープでアクセスできます。 –

+1

@Vincenzzzochi "I"の値が増分され、非ローカルを使用すると完全に機能します。 – n33rma

関連する問題