本やUdemy、Progateなどを用いてPythonやhtml、cssの学習過程を残していきます。

PythonでUnboundLocalErrorが出現したので、原因と解決方法をメモ

UnboundLocalError

後日投稿しますが、pythonを使ってタイピングゲームの作成中、「UnboundLocalError: local variable ‘point’ referenced before assignment」と言う入門書では見たこともないエラーが出現してテンパってしまいました。

問題のコードはこれだ!

import random

point = 0

def keytype():
    maxc = int("0x7a",16)
    minc = int("0x61",16)

    txt = random.randint(minc,maxc)
    txt = chr(txt)
    print("これ => {}".format(txt))
    typ = input("入力してください")

    if typ == txt:
        print("正解")
        point += 1
    return point

for i in range(5):
    point = keytype()

print(point)

何をしたかったかと言うと、、、
for i in range(5):でkeytype()関数を5回繰り返して、正解数をpointに代入。

が、 UnboundLocalError: local variable ‘point’ referenced before assignment なるものが出現して夢叶わず。

解決策

英単語メモ

unbound… バインド(束縛)されていない

local…地元の

error…エラー

直訳すると、「バインドされていない地元のエラー」???

直訳するとどんどん深みにハマっていきそうですが、localはおそらくdef keytype()内を指していると思われます。

もう少し中身を見てみると分かりそうな気がします。

 local variable ‘point’ referenced before assignment

英単語

variable… 変数

referenced… 参照された

assignment…割り当て、課題、譲渡

直訳すると、「ローカル変数である”point”は割り当ての前に参照された」です。

2行目に代入した変数”point”と関数内の”point”は別物であると判断されたみたいですね。

関数内のローカル変数と、外のグローバル変数は別物と言う事を忘れておりました。

スコープについて、もう一度ちゃんと意識する必要がありそうです。

グローバル変数の参照はできるっぽい

グローバル変数

グローバル変数を参照することはできます。

ちょっとややこしいのですが、グローバル変数を関数内で上書きしようとするとエラーが出るが、参照は普通にできるという事ですね。

ちなみに、グローバル変数を書き換える方法は、関数内で「global 変数」を宣言すれば可能です。

global宣言

上の様な感じですね。

この辺はもうちょっとちゃんとインプットして、また改めてメモを作ろうと思います。

この記事を書いた人

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です