【Python】UnboundLocalError: local variable referenced before assignmentの対処法

時計 2022.02.04 / 時計

【Python】UnboundLocalError: local variable referenced before assignmentの対処法

本記事ではPythonで発生するエラーの一つ、UnboundLocalErrorについて解説していきます。

Pythonでプログラムを作成していると以下のエラーが発生することがあります。

エラー

UnboundLocalError: local variable '***' referenced before assignment

***には変数名が表示されます。

このUnboundLocalErrorの原因と対処法について見ていきましょう。

UnboundLocalError

発生するエラー

Pythonでプログラムを作成しているときに以下のエラーが発生することがあります。

エラー

UnboundLocalError: local variable '***' referenced before assignment

エラー詳細を日本語に訳すと、ローカル変数***は割り当てられる(宣言)前に参照されたとなります。

エラーの原因

このエラーの日本語訳からエラーの原因がわかりますね。

エラーが発生した原因としては、関数内でローカル変数が宣言される前にプログラムによって参照されたことが原因です。

変数の宣言前に変数を参照してはいけないのは多くのプログラマーの方は理解していると思います。それでもこのエラーが発生してしまうことがあります。

多くの場合、グローバル変数を参照させているつもりなのに、プログラムではローカル変数を参照しにいってしまいエラーが発生しています。詳しくは次項で解説していきます。

UnboundLocalErrorの発生例

ローカル変数を宣言前に参照したことによる発生

以下のコードではUnboundLocalErrorが発生します。

def test():
    print(b)
    b = 54
test()
発生するエラー

UnboundLocalError: local variable 'b' referenced before assignment

この原因はローカル変数bを宣言する前にprint関数で変数bを参照したためです。

解決策としては、当たり前ですが参照前にローカル変数bを宣言することです。

def test():
    b = 54
    print(b)
test()

グローバル変数をローカル変数とみなしたことによる発生

以下のコードでは問題なさそうに見えますが、UnboundLocalErrorが発生します。

a = 54
def test():
    print(a)
    a = 10
test()
発生するエラー

UnboundLocalError: local variable 'a' referenced before assignment

エラーの原因としては、関数内で変数aがグローバル変数aではなく、ローカル変数aとして認識されてしまったからです。

このローカル変数としてみなされることによって発生するケースが最も多いと思います。

解決策としてはglobalを利用することです。関数の先頭で変数aがグローバル変数であることを宣言しましょう。

a = 54
def test():
    global a
    print(a)
    a = 10
test()

また関数内で演算子を使うときにも同様に注意が必要です。以下のコードでもUnboundLocalErrorが発生してしまいます。

a = 54
def test():
    a = a + 10
test()

これらのことを注意して関数内でグローバル変数を使うようにしてください。

まとめ

本記事「【Python】UnboundLocalError: local variable referenced before assignmentの対処法」はいかがでしたか。

どんなにPythonによるプログラミングが慣れてきても、このエラーが発生することがたまにあります。

みなさんも変数内でのグローバル変数の利用には注意してください。