1. ホーム
  2. パイソン

[解決済み】ローカル変数の初回使用後に再代入すると、UnboundLocalErrorが発生する。

2022-04-01 23:26:37

質問

次のコードはPython 2.5と3.0の両方で期待通りに動作します。

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

print(a, b, c)

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

しかし、この行をアンコメントすると (B) が表示されます。 UnboundLocalError: 'c' not assigned 行で (A) . の値は ab が正しく印刷されます。これには2つの理由があり、完全に困惑しています。

  1. の行でランタイムエラーが発生するのはなぜですか? (A) というのは、後の行のステートメントが (B) ?

  2. なぜ変数が ab は期待通りに印刷されましたが c はエラーになるのですか?

という説明しか思いつきません。 ローカル 変数 c は代入によって作成されます。 c+=1 という変数よりも優先されます。 c ローカル変数が作成される前でも もちろん、変数が存在する前にスコープを奪うことは意味がありません。

どなたかこの挙動を説明していただけませんか?

解決方法は?

Pythonは、関数内の変数に値を代入するのが関数内からか外からかによって扱いが異なります。 関数内で変数が代入された場合、デフォルトでローカル変数として扱われます。 したがって、この行をアンコメントすると、ローカル変数を参照しようとします。 c 値が代入される前に

もし、変数 c を参照するために、グローバルな c = 3 関数の前に割り当てられた

global c

を関数の1行目として使用します。

Python 3に関しては、現在では

nonlocal c

を持つ最も近い関数スコープを参照するために使うことができます。 c という変数があります。