ホームページ > バックエンド開発 > Python チュートリアル > Python で UnboundLocalError が発生するのはなぜですか?

Python で UnboundLocalError が発生するのはなぜですか?

Linda Hamilton
リリース: 2024-12-05 22:20:17
オリジナル
526 人が閲覧しました

Why Do I Get an UnboundLocalError in Python?

UnboundLocalError: Python の非バインド変数について

Python では、値が割り当てられる前にローカル変数が参照されると、UnboundLocalError が発生します。他のプログラミング言語とは異なり、Python では明示的な変数宣言は必要ありません。代わりに、変数は割り当てられたときに値にバインドされます。

UnboundLocalError をトリガーする 1 つの方法は、未割り当ての変数にアクセスすることです。

>>> foobar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foobar' is not defined
ログイン後にコピー

もう 1 つの方法は、代入操作の実行が失敗した場合です。条件ブロック内と同様:

def foo():
    if False:
        spam = 'eggs'
    print(spam)

>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in foo
UnboundLocalError: local variable 'spam' referenced before assignment
ログイン後にコピー

Python では、名前はさまざまな操作 (代入、関数) を通じて値にバインドされます。パラメーター、インポート ステートメント、例外ハンドラー、およびコンテキスト マネージャー。名前が関数スコープ内でバインドされている場合、その名前はローカル変数になります。関数内のグローバル変数にアクセスするには、グローバル ステートメントまたは非ローカル ステートメントを使用する必要があります (Python 3 の場合)。

たとえば、次の関数はグローバル変数 foo にアクセスしようとしますが、関数内でバインドされているため失敗します。スコープ:

foo = None
def bar():
    if False:
        foo = 'spam'
    print(foo)

>>> bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in bar
UnboundLocalError: local variable 'foo' referenced before assignment
ログイン後にコピー

ただし、グローバル foo を使用すると問題が解決されます:

foo = None
def bar():
    global foo
    if False:
        foo = 'spam'
    print(foo)

>>> bar()
None
ログイン後にコピー

の概念を理解する変数バインディングは、Python で UnboundLocalErrors を回避するために重要です。

以上がPython で UnboundLocalError が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート