2017-09-08 2 views
0

次の2つの例では、nonlocalで宣言された変数が存在しないことが正しいですか?これら2つの例で `nonlocal`で宣言された変数は存在しませんか?

次に、最初の例でエラーが発生していますが、2番目の例でエラーが発生していないのはなぜですか?ありがとう。

例1:

count = 0 

def make_counter(): 
    def counter(): 
     nonlocal count # SyntaxError: no binding for nonlocal 'count' found 
     count += 1 
     return count 
    return counter 

例2:Pythonドキュメント当たり

a = 5 

def f(): 
    a=2 
    class C1: 
     a = 3 
     def f1(self): 
      nonlocal a # refers to `a` local to `f` 
      a = 4 
     def f2(self): 
      self.f1() 
      print(self.a) 
    print(a) 

f() # 2 
print(a) # 5 

答えて

1

https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement

nonlocal

最寄り囲む範囲探し。例1では、あなたが持っている:

count = 0 # global scope 

def make_counter(): 
    # nonlocal scope 
    def counter(): 
     # nonlocal scope, count references something in the global scope 
     nonlocal count 
     count += 1 
     return count 
    return counter 

countは離れて二つの「スコープレベル」であるとglobalスコープでもあるので、それはnonlocalスコープではないのでnonlocalは、構文エラーがスローされます。実施例2では

a = 5 # global scope 

def f(): 
    # nonlocal scope 
    a=2 # "a" referenced in nonlocal scope! 
    class C1: 
     # nonlocal scope 
     a = 3 # "a" referenced in nonlocal scope! 
     def f1(self): 
      # local scope 
      # "a" most recently referenced in nearest enclosing scope, no syntax error! 
      nonlocal a 
      a = 4 
     def f2(self): 
      self.f1() 
      print(self.a) 
    print(a) 

f() # 2 
print(a) # 5 

実施例2に隣接nonlocal範囲で参照したaので、エラーをスローしません。

+3

例1は、 'count'が直前のスコープにないため失敗しません。すべての非グローバル*スコープで見つからないため失敗します。 "nonlocal'ステートメントは、リストされた識別子が、globals *を除いて、最も近い囲みスコープで以前にバインドされた変数を参照するようにします。 (emphasis mine) – chepner

+3

は#1で 'count'が** global **スコープ内にあるために投げます。スコープが離れているわけではなく、' nonlocal'はクロージャーインクロージャー(。等) –

+0

説明をありがとう!与えられた例は私がそれを1つ前のスコープであるものにしました。 – AetherUnbound

関連する問題