Atom's tech blog

Pythonを勉強しよう! ローカルとグローバルについて

f:id:iAtom:20201111094026j:plain

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 」文が用意されており、コードを見たときに「グローバル変数にアクセスしてますぅー」を明示することで可読性がよくなり、意図が伝わるようになっているのでは?と思います。

自分自身は、コードにコメント文を多く記述する方なので、そのときになったらコメント文にも「 グローバル変数へアクセス・・・・」みたいないこと記述するでしょう。たぶん。