Python 3: UnboundLocalError: 割り当て前にローカル変数が参照されています [重複] 質問する

Python 3: UnboundLocalError: 割り当て前にローカル変数が参照されています [重複] 質問する

次のコードではエラーが発生しますUnboundLocalError: local variable 'Var1' referenced before assignment:

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result 1")
    elif Var2 == 1 and Var1 > 0:
        print("Result 2")
    elif Var1 < 1:
        print("Result 3")
    Var1 -= 1
function()

これをどうすれば修正できますか?

ベストアンサー1

これは、が存在するにもかかわらず、関数内の名前 (一番下の行)Var1に代入ステートメントも使用しているためです。当然、これにより、関数のスコープ内に (または) と呼ばれる変数が作成されます(実際には、またはは既存の変数を更新 (再割り当て) するだけですが、理由は不明 (このコンテキストでは一貫性がある可能性が高い) ですが、Python はそれを代入として扱います)。Python インタープリターは、モジュールのロード時にこれを認識し、グローバル スコープをローカル スコープ内で使用すべきではないと (正しく) 決定します。これにより、変数がローカルに割り当てられる前に参照しようとすると問題が発生します。Var1Var1 -= 1Var1-=+=Var1

必要のない場合、グローバル変数を使用することは、混乱を招き、問題のあるコードにつながるため、Python 開発者には通常好まれません。ただし、コードが意味することを実現するためにグローバル変数を使用したい場合は、関数の先頭に以下を追加するだけです。

global Var1, Var2

これにより、関数のローカル スコープ内でまたは変数を定義する意図がないことが Python に通知されます。Python インタープリターはモジュールのロード時にこれを認識し、前述の変数への参照をグローバル スコープで検索することを決定します (これは正しい判断です)。Var1Var2

いくつかのリソース

  • Pythonのウェブサイトには素晴らしい説明この一般的な問題について。
  • Python 3は関連するnonlocal声明 - それも確認してください。

おすすめ記事