ホームページ >バックエンド開発 >Python チュートリアル >クロージャ内の `counter = 1` が Python で `UnboundLocalError` を引き起こすのはなぜですか?

クロージャ内の `counter = 1` が Python で `UnboundLocalError` を引き起こすのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-26 18:09:10795ブラウズ

Why Does `counter  = 1` Inside a Closure Cause an `UnboundLocalError` in Python?

クロージャの非バインド ローカル変数エラーについて理解する

クロージャを使用してコードを記述する場合、変数のスコープを考慮することが重要です。この特定のケースでは、なぜ次のコードで UnboundLocalError が発生するのかという疑問が生じます:

counter = 0

def increment():
  counter += 1

increment()

この疑問に答えるには、まず Python のクロージャーの概念を理解する必要があります。クロージャは、スコープが終了した後でも、それが定義されたスコープ内で定義された変数へのアクセスを保持する関数です。この場合、カウンター変数はグローバル スコープで定義され、クロージャとみなされ、increment() 関数内で参照されます。

ただし、Python では、関数内の変数は自動的にローカル変数として扱われます。特に明示的に宣言されていない限り。 increment() 内で line counter = 1 が実行されると、インタプリタはローカル カウンタ変数をインクリメントしようとします。ただし、increment() 関数内で counter に値が割り当てられていないため、バインドされていないままになります。これにより、UnboundLocalError が発生します。

この問題を解決するには、主に 2 つのアプローチがあります。

  1. グローバル キーワードを使用する: 目的がcounter をグローバル変数にするには、increment() 関数内で global キーワードを使用して、counter が同じローカル変数ではなくグローバル変数を参照することを明示的に宣言できます。 name.
counter = 0

def increment():
  global counter
  counter += 1

increment()
  1. 非ローカルの使用 (Python 3.x のみ): Python 3.x では、入れ子関数内で nonlocal キーワードを使用して、変数を非ローカルとして扱うことを宣言します。つまり、囲んでいる変数内の同じ名前の変数にアクセスできることを意味します。スコープ。
counter = 0

def increment():
  nonlocal counter
  counter += 1

increment()

以上がクロージャ内の `counter = 1` が Python で `UnboundLocalError` を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。