ホームページ >バックエンド開発 >Python チュートリアル >Python が入れ子関数で「UnboundLocalError」をスローする理由と、それを解決するにはどうすればよいですか?

Python が入れ子関数で「UnboundLocalError」をスローする理由と、それを解決するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-23 08:20:22721ブラウズ

Why Does Python Throw an `UnboundLocalError` in Nested Functions, and How Can It Be Resolved?

UnboundLocalError: Nested Blocks の Premature Variable Assignment

提供されたコードのように、入れ子になった関数スコープを操作する場合、Python でエラーが発生する可能性がありますメッセージ「UnboundLocalError: 割り当て前にローカル変数 'c​​' が参照されました。」このエラーは、ネストされたブロック内で割り当てられた変数が初期化される前に参照された場合に発生します。

コード例:

a, b, c = (1, 2, 3)

def test():
    print(a)
    print(b)
    c += 1  # UnboundLocalError here

コードは、変数 a、b、および変数を出力しようとします。 c 関数 test() 内。 a と b はグローバル変数であり、直接アクセスできますが、c は関数のローカル スコープ内に存在します。その結果、割り当て c = 1 により、同じ名前のグローバル変数をオーバーライドするローカル変数 c が作成されます。

コードが実行されると、Python は a と b を初期化し、test() の呼び出しに進みます。 test() 内では、a と b は正常に出力されますが、値が割り当てられる前にローカル変数 c を出力しようとするため、エラーが発生します。

この問題を解決するには、変数を明示的に宣言する必要があります。値を割り当てる前に、global キーワードを使用して関数内で global として指定します。これにより、ローカル変数を作成する代わりにグローバル変数を使用するように Python に通知されます。修正されたコードは次のようになります。

a, b, c = (1, 2, 3)

def test():
    global c  # Declare 'c' as global
    print(a)
    print(b)
    c += 1

また、Python 3 では、同じ名前の変数を持つ最も近い囲み関数スコープを参照する nonlocal キーワードを使用できます。これにより、外部関数で宣言された非大域変数を変更できるようになります。非ローカルを使用した更新されたコードは次のようになります:

a, b, c = (1, 2, 3)

def test():
    nonlocal c
    print(a)
    print(b)
    c += 1

以上がPython が入れ子関数で「UnboundLocalError」をスローする理由と、それを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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