Python3.8.5でのグローバル変数とローカル変数について。
x = 'あいうえお' #グローバル変数xの宣言
def aaa():
print(x) #グローバル変数xの出力
aaa() #関数aaaの実行
#②グローバル変数とローカル変数と関数のパターンA
x1 = 'あいうえお' #グローバル変数x1を宣言
def bbb():
x1 = 123 #ローカル変数x1が宣言される
print(x1) #ローカル変数x1の出力
bbb() #関数bbbの実行
#③グローバル変数とローカル変数と関数のパターンB
x2 = 'あいうえお' #グローバル変数x2の宣言
def ccc():
print(x2) #下行のローカル変数x2の宣言によりまだ存在しないローカルx2を求めてバグる
x2 = 123 #ローカル変数x2の宣言
print(x2) #ローカル変数x2の出力
ccc() #関数cccの実行
#④グローバル変数とローカル変数と関数のパターンC
x3 = 'あいうえお' #グローバル変数x3の宣言
def ddd():
global x3 #x3を関数ddd内でx3がグローバル変数であることを宣言
print(x3) #上行の宣言によりまだ存在しないローカル変数x3ではなくグローバルx3を参照
x3 = 123 #ローカル変数x3の宣言
print(x3) #ローカル変数x3の出力
ddd() #関数dddの実行
#⑤locals関数でローカル変数の値を確認
x4 = 'あいうえお'
def eee():
x44 = 1
x444 = 2
x4444 = 3
print(x44, 'と', x444, 'と', x4444) #1と2と3
print(locals()) #{'x44': 1, 'x444': 2, 'x4444': 3}
eee() #関数eeeの実行
print(globals()) #存在するグローバル変数の値をそれぞれ辞書型で返す
print(locals()) #ここは関数内ではないのでglobals()と同じ結果を返す
グローバル変数とは、ローカル変数ではない変数のことであり、関数の外で宣言された変数のことです。
ローカル変数とは、グローバル変数ではない変数のことであり、特定の関数の中で宣言された関数のことです。
上記①のプログラムでは、グローバル変数xを関数内で出力しています。
関数aaa内にはまだローカル変数xが存在していないので、関数等のパラメータに変数xを指定するとグローバル変数xの値が参照されます。
②のプログラムでは、グローバル変数x1と同一名のローカル変数x1を関数bbb内で宣言して出力しています。
このような場合は、関数bbb内ではグローバル変数x1ではなくローカル変数x1が優先して参照されます。
③は②とほぼ同じなのですが、関数ccc内でローカル変数x2の宣言をする前に変数x2をprint関数で処理しようとしています。
このようなパターンでは、Pythonはなぜかグローバル変数x2を参照するのではなく、下の行で宣言される予定のローカル変数x2を参照しようとします。
しかしまだローカル変数x2は存在していませんので、その結果errorが吐き出されます。
④は③の不具合を解消したパターンです。
「globas x3」と記述することで、関数ddd内でローカル変数x3が宣言される前に変数x3をグローバル変数だと宣言しています。
この処理によって、ローカル変数x3が宣言されるよりも上の行ではパラメータに変数x3を指定するとグローバル変数x3を参照してくれます。
⑤ではlocals関数やglobals関数をつかって、グローバル変数の種類や値、または特定の関数内のローカル変数の種類や値を調べています。
locals関数は、その関数内に存在するすべてのローカル変数の変数名とその値を辞書型で返します。
globals関数は、そのPythonファイル内に存在するすべてのグローバル変数の変数名とその値を辞書型にして返します。
ちなみにlocals関数を関数の外で使うと、globals関数の返り値と同じ値を返してきます。
以上です。