後日投稿しますが、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 変数」を宣言すれば可能です。
上の様な感じですね。
この辺はもうちょっとちゃんとインプットして、また改めてメモを作ろうと思います。