UnboundLocalError は、(最初​​に使用した後でも)(再)割り当てされる変数(グローバルであるはず)を使用しようとしています 質問する

UnboundLocalError は、(最初​​に使用した後でも)(再)割り当てされる変数(グローバルであるはず)を使用しようとしています 質問する

このコードを試すと:

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

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

次の行でエラーが発生しますprint(c):

UnboundLocalError: local variable 'c' referenced before assignment

Pythonの新しいバージョンでは、

UnboundLocalError: 'c' not assigned

一部の古いバージョンでは。

をコメントアウトするとc += 1、両方printの が成功します。

理解できません。印刷ab動作はなぜ動作するのでしょうかc。コードの後半で、なぜ失敗するのc += 1でしょうか。print(c)

割り当てによってローカル変数c += 1が作成されるようですが、これはグローバル変数よりも優先されます。しかし、変数が存在する前にスコープを「盗む」ことはできるのでしょうか?ここではなぜ明らかにローカルなのでしょうか?ccc


参照関数内でグローバル変数を使用する関数内からグローバル変数を再割り当てする方法に関する質問の場合、Python で、グローバルスコープではないが外側の(囲む)スコープにある変数を変更することは可能ですか?囲んでいる関数 (クロージャ) からの再割り当て用。

見るグローバル変数にアクセスするために「global」キーワードが必要ないのはなぜですか?OP がエラーを予想したが、キーワードなしでグローバルにアクセスしただけでエラーが発生しなかっ場合global

見るPython で名前を「アンバウンド」にするにはどうすればよいでしょうか? どのコードが `UnboundLocalError` を引き起こす可能性がありますか?OPが変数がローカルであると想定していたが、あらゆるケースで割り当てを妨げる論理エラーがある場合。

ベストアンサー1

Python は、関数の内側から変数に値を割り当てるか外側から割り当てるかによって、関数内の変数を異なる方法で扱います。関数内で変数が割り当てられると、デフォルトでローカル変数として扱われます。したがって、行のコメントを解除すると、c値が割り当てられる前にローカル変数を参照しようとすることになります。

関数の前に割り当てられたcグローバル変数を参照したい場合は、c = 3

global c

関数の最初の行として。

Python 3に関しては、現在

nonlocal c

変数を持つ最も近い関数スコープを参照するために使用できますc

おすすめ記事