ホームページ  >  記事  >  バックエンド開発  >  入れ子関数のスコープでバインドされていないローカル変数エラーを処理する方法は?

入れ子関数のスコープでバインドされていないローカル変数エラーを処理する方法は?

DDD
DDDオリジナル
2024-10-21 18:42:29609ブラウズ

How to Handle Unbound Local Variable Errors in Nested Function Scopes?

入れ子関数スコープでの UnboundLocalError の解決

入れ子関数内の非バインド ローカル変数にアクセスするときに、Python インタープリターで UnboundLocalError が発生します。この問題は、ネストされた関数が外部関数内で宣言された変数を変更しようとすると発生します。

例:

次のコードを考えてみましょう:

<code class="python">def outer():
    ctr = 0

    def inner():
        ctr += 1

    inner()</code>

このコードを実行すると、インタープリタは次のエラーを生成します:

Traceback (most recent call last):
  File "foo.py", line 9, in <module>
    outer()
  File "foo.py", line 7, in outer
    inner()
  File "foo.py", line 5, in inner
    ctr += 1
UnboundLocalError: local variable 'ctr' referenced before assignment

原因:

ネストされたスコープがあるにもかかわらず、内部関数は 'ctr にアクセスできません' 外部関数で定義されているため、変数を直接使用できます。これにより、バインドされていない変数が発生し、UnboundLocalError がトリガーされます。

解決策:

Python 3 では、ネストされたスコープで変数の再バインドを可能にする 'nonlocal' ステートメントが提供されます。コードを変更して「非ローカル」を含めると問題が解決します:

<code class="python">def outer():
    ctr = 0

    def inner():
        nonlocal ctr
        ctr += 1

    inner()</code>

Python 2 ユーザーの場合は、別のアプローチが必要です:

  • ベアネームの削除:
    裸の ctr 変数を削除し、データ構造内または属性として配置します。たとえば、 ctr = [0].
  • 変数の再割り当て:
    ベアネームの再バインドを使用する代わりに、内部関数内で ctr 変数を再割り当てします: ctr = ctr 1.

以上が入れ子関数のスコープでバインドされていないローカル変数エラーを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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