Pythonを勉強しよう! ローカルとグローバルについて
Python初心者の備忘録.....
今回はローカルとグローバルのスコープと変数についてです。
プログラミングする上で絶対意識する必要があります。例えば関数外で作成した変数は、同じ名称で作成できないが、関数内では、関数外と同じ変数でもよい。またアクセス可否など。
ローカルスコープ/変数
関数の入力パラメータ、関数内で使用する目的で設定した変数は、関数内のみで使用可能です。これを「 ローカルスコープ 」といいます。
スコープ(Scope)は「 範囲 」の意味ですので、関数内の範囲だけと考えるといいです。
「 ローカル変数 」は、そのローカルスコープで使用する変数のことをいいます。
グローバルスコープ/変数
「 ローカルスコープ 」は関数内に対して「 グローバルスコープ 」は、関数外の範囲を示します。関数外に設定された変数のことを「 グローバル変数 」といいます。
ルール
- グローバルスコープからローカル変数にはアクセスできない
- ローカルスコープからグローバル変数にアクセスできる
- ローカルスコープとグローバルスコープに同じ変数名を設定できる
- 異なる関数に同じローカル変数名を設定できる
- モジュール内の異なる関数のローカル変数はアクセスできない
@ モジュールとは、Pythonファイルの「 .py 」のことをいいます。
このようなルールがあるのは、他変数への影響を考えてしまい、バグになる可能性を極力減らすことが目的と考えます。
グローバル変数値の変更
ローカルスコープからグローバル変数の変更は「 global 」文で可能です。
このglobal文で宣言でグローバル変数宣言を行い、ローカルスコープ内でグローバル変数へアクセスを行います。
global "グローバル変数名"
・サンプルコード
def localfunc1(): # 関数内でグローバル変数を宣言 global chkValue # 関数内でグローバル変数値の変更 chkValue = "localfunc1Chg" def localfunc2(): # localfunc2内のローカル変数を設定 chkValue = "localfunc2Chg" def chkValuePrint(): print(chkValue) # localfunc1()で作成したグローバル変数に設定 chkValue = "chgGlobal" # グローバル変数を変更 localfunc1() # グローバル変数を出力 chkValuePrint() # グローバルアクセスできないlocalfunc2を起動 localfunc2() # グローバル変数を出力 chkValuePrint() # 出力結果 # localfunc1Chg # localfunc1Chg
出力結果よりlocalfunc1()の関数でグローバル変数へアクセス可能であること、21行目のlocalfunc2()を起動してもグローバル変数は変更されていないことがわかります。
個人的にはローカルスコープからグローバル変数の値を変更すべきではないと考えています。本来グローバルスコープでしかアクセスできない理由があり、そのようになっていると......。
やも得ず、どうしても関数内で変更が必要なこともあるので「 global 」文が用意されており、コードを見たときに「グローバル変数にアクセスしてますぅー」を明示することで可読性がよくなり、意図が伝わるようになっているのでは?と思います。
自分自身は、コードにコメント文を多く記述する方なので、そのときになったらコメント文にも「 グローバル変数へアクセス・・・・」みたいないこと記述するでしょう。たぶん。