Python クロージャの UnboundLocalError について
Python では、クロージャは、外側のスコープから変数にアクセスする便利な方法を提供します。ただし、クロージャの動作と、発生する可能性のある落とし穴を理解することが重要です。
問題: UnboundLocalError
クロージャに関する一般的な問題の 1 つは、UnboundLocalError の発生です。このエラーは、関数内で定義されていない変数、またはクロージャ内で適切に定義されていない変数にコードがアクセスしようとした場合に発生する可能性があります。
例:
考慮してください。次のコード:
counter = 0 def increment(): counter += 1 increment()
このコードを実行すると、UnboundLocalError が発生する可能性があります。なぜこのようなことが起こるのでしょうか?
解決策: スコープとクロージャを理解する
Python は、関数内の代入に基づいて変数のスコープを動的に決定します。関数内で変数に値が割り当てられている場合、その変数はその関数に対してローカルであるとみなされます。
上の例では、行 counter = 1 により、暗黙的に counter が increment() 関数内のローカル変数になります。ただし、カウンターの 0 への初期割り当ては関数の外部にあるため、グローバル変数になります。
increment() 関数が実行されると、ローカル変数 counter をインクリメントしようとします。ただし、まだ割り当てられていないため、UnboundLocalError が発生します。
問題の解決:
この問題を解決するには、グローバル関数内でカウンタ変数をグローバルとして明示的に宣言するためのキーワード:
def increment(): global counter counter += 1
または、increment() がlocal 関数とカウンターはローカル変数です。Python 3.x では nonlocal キーワードを使用できます:
def increment(): nonlocal counter counter += 1
変数のスコープを適切に定義することで、UnboundLocalErrors を回避し、コードの正しい動作を保証できます。 .
以上がPython クロージャが UnboundLocalError をスローすることがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。