>>> gvalue = 0
>>> def t():
... gvalue = 1
...
>>> t()
>>> gvalue
0
>>>
スコープが内側になると変数は隔離されます
>>> gvalue = 0
>>> def t():
... gvalue = 1
... print(gvalue)
...
>>> t()
1
>>> gvalue
0
>>>
代入時は隔離されますが、参照のみならグローバル変数を利用できます。
ただし、
>>> gvalue = 0
>>> def t():
... print(gvalue)
... gvalue = 1
...
>>> t()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in t
UnboundLocalError: local variable 'gvalue' referenced before assignment
>>>
グローバル変数として利用してから、代入を行うと、
前者はグローバル変数、後者はローカル(関数内)変数と解釈が食い違うため、エラーが発生します。
それを避けるために、グローバル変数を利用するときは
>>> gvalue = 0
>>> def t():
... global gvalue
... gvalue = 1
...
>>> gvalue
0
>>> t()
>>> gvalue
1
のようにglobal
で「グローバル変数を使う」と宣言してください。
(関数の一番最初で宣言するのが吉です。)
#まとめ
グローバル変数を使うとき
参照のみならグローバル宣言を行わなくてもよい。
(宣言してもいいしそっちのほうがわかりやすいけれど)
グローバル変数を操作する場合はしっかり宣言しましょう。