とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

グローバル変数とローカル変数について(Python)

f:id:feci:20210726231508j:plain

Python3

 

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関数の返り値と同じ値を返してきます。

 

 

以上です。