pythonで下のように書いたとき、エラーが発生した。
def foo():
a+=1
return
def main():
global a
a=0
foo()
main()
UnboundLocalError: local variable 'loadIndex' referenced before assignment
..ん?グローバル変数で定義してるんだけど?
調べてみたら、pythonのglobal宣言は、そのスコープの中においてaをglobal変数として扱う、ということらしい。
つまり、fooのローカルスコープから参照したときにaはローカルスコープから探し出される。
よって、foo内でaを参照したければ、foo内でもglobal宣言してあげる必要があるってこと。
def foo():
global a
a+=1
return
def main():
global a
foo()
main()
こう書けば大丈夫。
下の記事がpythonのスコープについてわかりやすい。
https://pouhon.net/python-scope/2236/
クラスインスタンスの場合
先程はint型の変数で実験を行ったが、こんどはクラスインスタンスについて同じことを行ってみる。
class B():
def __init__(self) -> None:
self.b=0
def add(self):
self.b+=1
b=B()
def foo():
b.add()
return
def main():
foo()
foo()
print(b.b)
main()
以下出力
2
今度はfoo内で global b としなくてもエラーが発生しなかった。
おそらく、変数への代入行為を行うとその時点でローカルスコープが発生するんだと思う。詳しく調べたら書きます。