global
このページでは豊富な例を用いてPythonのglobal文の使い方を学ぶことができます。
global文は指定した変数をグローバル変数として扱うように宣言します。
global文を使用すると、たとえば関数ブロック内からグローバル変数の値を変更することができ、コードに柔軟性をもたらします。 しかし、global文の乱用はコードの見通しを悪くするので、必要最低限の使用に留めることが推奨されます。
TL;DR
基本
# グローバル変数を変更できない場合
val1 = 'python'
def func1():
# このままだとfunc1内のローカル変数val1への代入となる
val1 = 'JavaScript'
print(val1)
func1()
==> JavaScript
# グローバル変数の表示
print(val1)
==> python
# グローバル変数を変更する場合
val2 = 'python'
def func2():
# global文を使用してglobal変数へのアクセスを宣言する
global val2
val2 = 'JavaScript'
print(val2)
func2()
==> JavaScript
# グローバル変数の表示
print(val2)
==> JavaScript
# global文で指定する名前は、同じブロック内でglobal文より前で使用できない
val3 = 'python'
def func3():
val3 = 'variables'
global val3
val3 = 'JavaScript'
print(val3)
==> SyntaxError: name 'val3' is assigned to before global declaration
複数のグローバル変数の指定
# 複数のグローバル変数を指定する場合
value1 = 'python'
value2 = 'PYTHON'
def func1():
global value1, value2
# 変更前のグローバル変数にアクセス
print(value1, value2)
value1 = 'func1'
value2 = 'FUNC1'
func1()
==> python PYTHON
# 変更後のグローバル変数にアクセス
print(value1, value2)
==> func1 FUNC1
解説
基本
以下のコード例のように、Pythonでは関数内で通常通り代入された変数はローカル変数とみなされ、外側のブロックに定義されたグローバル変数へ影響を及ぼしません。
しかし、global文でグローバル変数である変数名を指定すると、その変数は対象のブロック内でグローバル変数として扱うことができるようになります。
一連の処理の中でglobal文に指定された変数が無い場合は、新たなグローバル変数を定義したことになります。
注意点として、global文に指定した変数名は同一ブロック内でglobal文より前に使用できない点が挙げられます。
global文の使用により、コードに柔軟性が生まれる側面もあります。 しかし、global文の多用はコードの可読性を著しく下げてしまう可能性もあります。 そのため、global文の使用を必要最小限とすることが一般的には推奨されます。
# グローバル変数を変更できない場合
val1 = 'global'
def func1():
val1 = 'func1'
print(val1)
func1()
==> func1
# グローバル変数の表示
print(val1)
==> global
# グローバル変数を変更する場合
val2 = 'global'
def func2():
# global文を使用
global val2
val2 = 'func2'
print(val2)
func2()
==> func2
# グローバル変数の表示
print(val2)
==> func2
# global文の誤った使用方法
val3 = 'global'
def func3():
val3 = 'local'
global val3
val3 = 'func3'
print(val3)
==> SyntaxError: name 'val3' is assigned to before global declaration
複数のグローバル変数の指定
複数のグローバル変数を特定ブロック内で一度に扱うこともできます。
その場合、複数行にglobal文を宣言するか、または,
(カンマ)区切りで1つのglobal文に複数の変数名を列挙してください。
# 複数のグローバル変数を指定する場合
val_1 = 'global'
val_2 = 'GLOBAL'
def func1():
global val_1, val_2
# 変更前のグローバル変数
print(val_1, val_2)
val_1 = 'func1'
val_2 = 'FUNC1'
func1()
==> global GLOBAL
# 変更後のグローバル変数
print(val_1, val_2)
==> func1 FUNC1