299

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

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

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

4

5 に答える 5

616

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

必要以外にグローバル変数を使用することは、通常、Python 開発者から嫌われます。コードが混乱したり、問題を引き起こしたりするからです。ただし、コードが意味することを達成するためにそれらを使用したい場合は、関数の先頭に次のように追加するだけです。

global Var1, Var2

これは、関数のローカル スコープ内でor変数を定義するつもりがないことを Python に伝えます。Python インタープリターは、モジュールのロード時にこれを確認し、グローバル スコープで前述の変数への参照を検索することを (正しく) 決定します。Var1Var2

いくつかのリソース

  • Python の Web サイトには、この一般的な問題についての優れた説明があります。
  • Python 3 は関連するnonlocalステートメントを提供しています - それもチェックしてください。
于 2012-06-01T14:19:51.503 に答える
131

関数内で変数の値を設定すると、Python はその名前でローカル変数を作成するものとして認識します。このローカル変数は、グローバル変数をマスクします。

あなたの場合、Var1ローカル変数と見なされ、設定される前に使用されるため、エラーが発生します。

この問題を解決するために、global Var1関数を入れることで、それがグローバルであると明示的に言うことができます。

Var1 = 1
Var2 = 0
def function():
    global Var1
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()
于 2012-06-01T14:19:54.873 に答える
98

グローバルに依存するのではなく、パラメーターを渡すことでこれを修正できます

def function(Var1, Var2): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    return Var1 - 1
function(1, 1)
于 2012-06-01T14:15:32.050 に答える
12

私はこの振る舞いが好きではありませんが、これが Python のしくみです。この質問は他の人によってすでに回答されていますが、完全を期すために、Python 2 にはそのような癖があることを指摘しておきます。

def f(x):
    return x

def main():
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

Python 2.7.6 はエラーを返します。

Traceback (most recent call last):
  File "weird.py", line 9, in <module>
    main()
  File "weird.py", line 5, in main
    print f(3)
UnboundLocalError: local variable 'f' referenced before assignment

Python は、fが でローカル変数として使用されている[f for f in [1, 2, 3]]ことを確認し、 でローカル変数でもあると判断しますf(3)global f次のステートメントを追加できます。

def f(x):
    return x

def main():
    global f
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

それは機能します。しかし、f は最後に 3 になります...つまりprint [f for f in [1, 2, 3]]、グローバル変数fが に変更さ3れるため、関数ではなくなります。

幸いなことに、括弧を に追加した後、Python3 で問題なく動作しprintます。

于 2014-10-27T01:10:52.470 に答える