Pythonにおけるグローバル変数と局所変数の理解と違い


前言
プログラミングを学んだ人は大域変数と局部変数という二つの名詞に慣れていないはずです。Pythonも多数のプログラミング言語と同じです。大域変数と局部変数の概念もあります。
しかし、他のプログラミング言語とはまた違っています。
大域変数と局所変数の本質的な違いは、作用領域にあります。
分かりやすい言葉で理解すると、
グローバル変数はpyファイル全体で宣言されています。全体の範囲でアクセスできます。
ローカル変数は、ある関数で宣言されています。この関数でしか呼び出されません。範囲外で呼ぼうとしたら、プログラムが破裂します。
関数の内部に大域変数と同じ名前の局所変数を定義すると、予期しない効果をもたらす可能性があります。そのため、このように使うことを勧めません。このようにすると、プログラムが非常に不健全になります。
いくつかの例を直接に見て、グローバル変数と局所変数の違いを理解しましょう。
Demo 1:

def fun(x):
 y=2
 print("       :",x*y)
num1=1
print("  num1=",num1)
fun(num1)
print("y   :",y)
実行結果:

エラーの原因は、ローカル変数にアクセスしようとしたが、アクセス先はこの変数yのスコープ内にないからです。
Demo 2:

def fun():
 num1=2
 print("      num1=",num1)
num1=1
print("  num1=",num1)
fun()
print("      num1=",num1)
実行結果:

関数の内部で大域変数に対する修正後、関数の実行が完了しました。修正の結果は無効です。大域変数は影響を受けません。
再確認:
Demo 3:

def fun():
 num1*=2
 print("      num1=",num1)
num1=1
print("  num1=",num1)
fun()
print("      num1=",num1)
実行結果:

新聞を間違えました。これは、fun()関数で局所変数num 1が使用されていますが、大域変数と同名の局所変数だけです。使用前に値が与えられています。このように使用しないことを改めて強調しました。
globalキーワード
本当に関数の中でグローバル変数の値を変更したいなら、globalキーを使います。
Demo 4:

def fun():
 global num1
 num1=2
 print("      num1=",num1)
num1=1
print("  num1=",num1)
fun()
print("      num1=",num1)
実行結果:

globalのキーワードを使うと、pythonコンパイラという変数はローカル変数ではなくグローバル変数であるということを教えます。
nonlocalキーワード
もう一つの変数に関するキーワードnonlocalを見てください。字面では現在の変数は局所変数ではないという意味です。nonlocalはPython 3.0に追加されたキーワードで、python 2.xはサポートされていません。
まず、下のコードを見てみます。

def fun():
 num2=3
 def fun2():
 num2*=2
 print("num2=",num2)
 return fun2()
 
fun()
実行結果:

エラーの原因は前のものと同じです。未定義の局所変数を使っていますが、num 2も大域変数ではなく、fun 2関数の外層変数だけで、globalを強引に使ってnum 2を定義すると同じようにエラーが発生します。
この時はnonlocalのキーワードを使う必要があります。

def fun():
 num2=3
 def fun2():
 nonlocal num2
 num2*=2
 print("num2=",num2)
 return fun2()
 
fun()
実行結果:

これでプログラムが正常に実行されます。
締め括りをつける
ここでPythonの大域変数と局部変数に関する記事を紹介します。Python大域変数と局部変数の内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。