4.ローカル変数とグローバル変数について
4.ローカル変数とグローバル変数について
変数には、ローカル変数とグローバル変数があり、ローカル変数は関数の中で定義されている変数のことである。次のコードでは、関数 "func1" の中で変数 "a" が定義されているので、変数 "a" はローカル変数となる。
def func1():
a = 10
# ローカル変数
print(a)
func1()
実行結果
10
次のコードでは、関数
"func2" の外で変数 "a" が定義されているので、変数 "a"はグローバル変数となる。つまり、グローバル変数とは、関数外で定義されている変数のことである。
a = 1000 # グローバル変数
def func2():
print(a)
func2()
実行結果
1000
ローカル変数とグローバル変数の決定的な違いを、変数スコープ(変数が有効な範囲)の違いとして、ローカル変数とグローバル変数を同時に用いる場合の次のサンプルコードで確認する。
a = 1 # グローバル変数
def func3():
a = 1000
# ローカル変数
print(a)
実行結果
1000
この場合、結果として出力されるのは、「1」「1000」のどちらかを考えると、答えは「1000」となる。これは、関数func3が実行される際に、関数内の変数aが参照されているためである。では、次のサンプルコードではどうか。答えとして出力されるのは「1」で、グローバル変数が参照されたことになる。
a = 1 #
グローバル変数
def func4():
a = 1000
# ローカル変数
print(a)
func4()
実行結果
1
ローカル変数とグローバル変数の違いは、ローカル変数が変数を宣言した関数内でのみ有効(利用可能)であり、グローバル変数はプログラム内のどこでも有効(利用可能)であるということである。次のサンプルコードでは、ローカル変数を関数外で利用しようとしてエラーとなる例であり、ローカル変数が関数内でのみで有効となっていることが理解できる。このように、ローカル変数とグローバル変数は、その有効範囲が異なるということが明確に理解できる。
a = 1 # グローバル変数
def func5():
b = 1000 # ローカル変数
print(a)
func5()
print(b) # エラー発生
実行結果
1
NameError:
name 'b' is not defined
ローカル変数とグローバル変数の名称については、ローカル変数とグローバル変数は同じ名称でも共存可能であり、Pythonは明確に読み分け正常に動作する。つまり、Pythonの動きとしては、まずローカル変数を探しに行き、無ければグローバル変数を参照するような動きをする。
a = 1 # グローバル変数
def func6():
a = 1000
# ローカル変数
print (a) # ローカル変数を表示
func6()
print (a) # グローバル変数を表示
実行結果
1000
1
別の関数名であれば同じ名称のローカル変数を定義しても可能。
a = 1 # グローバル変数
def func7():
a = 1000
# ローカル変数
print(‘ア=’,a)
a = "Hello World" # ローカル変数
print(“イ=“,a)
func7()
func8()
print(“ウ=”,a)
実行結果
ア=1000
イ=Hello
World
ウ=1
変数スコープが重複しなければ変数名称は被ってもエラーは発生しない。逆に変数スコープが重複している場合では、同じ変数名を利用すると上書きされるので注意が必要である。
def func7():
a =
1000 # ローカル変数
a =
"Hello World" # ローカル変数
print(a)
func7()
実行結果
Hello World
関数内で定義する変数はローカル変数であるとしたが、実は関数内でもグローバル変数の値を宣言することが可能である。その方法は、関数内の定義でglobal変数名として宣言し、ローカル変数をグローバル変数に変更する方法である。3行目のglobalは、これから使用する変数aが「グローバル変数である」ということを宣言する役割を担っている。
a=1
def func9():
global a
# aをglobal変数名として宣言
a = 1000
# global変数aに整数値1000を代入
print(a)
func9()
print(a)
実行結果
1000
1000
ゆえに、次のサンプルプログラムのように、グローバル変数が既に存在している場合は上書きすることになる。
a = 1
def func9():
global a
# aをglobal変数名として宣言
a = 1000
# global変数aに1000を上書き
print(a)
func9()
print(a)
実行結果
1000
1000