Pythonの変数スコープ入門:ローカル変数とグローバル変数の違いを理解する

Pythonでプログラミングをしていると、「この変数はどこからアクセスできて、どこからはできないのか」という有効範囲の問題に直面します。この変数が有効な範囲のことをスコープと呼びます。

スコープのルールを正しく理解することは、予期せぬエラーを防ぎ、読みやすいコードを書くための第一歩です。この記事では、グローバルスコープローカルスコープ、そしてそれぞれで定義されるグローバル変数ローカル変数の違いについて、4つの基本ルールに沿って解説します。


目次

スコープの基本:グローバルとローカル

まず、2つの基本的なスコープについて理解しましょう。

  • グローバルスコープ: プログラムの一番外側の領域です。ここに定義された変数をグローバル変数と呼び、プログラムのどこからでもアクセス(読み取り)できます。
  • ローカルスコープ: 関数(def文)の内側の領域です。ここに定義された変数をローカル変数と呼び、その関数の中でのみ有効です。

ルール1:グローバルスコープからローカル変数は使えない

関数の中で作成されたローカル変数は、その関数の外側(グローバルスコープ)からアクセスすることはできません。

def define_user():
    # user_id は define_user関数のローカル変数
    user_id = 100
    print(f"関数内では user_id = {user_id} です。")

# 関数を呼び出す
define_user()

# 関数の外からローカル変数にアクセスしようとするとエラーになる
# 次の行は NameError を引き起こします
# print(user_id) 

define_user()関数を実行すると、関数内のprint文は正しく実行されます。しかし、関数の外でprint(user_id)を実行しようとすると、Pythonは「user_idという名前の変数は存在しません」という**NameError**を発生させます。これは、user_idが関数のローカルスコープに閉じているためです。


ルール2:ローカルスコープからグローバル変数は読める

ローカルスコープとは対照的に、グローバル変数はローカルスコープ(関数の中)から読み取ることができます。

# グローバル変数を定義
app_version = "2.0.1"

def display_info():
    # 関数の中からグローバル変数を読み取る
    print(f"現在のバージョンは {app_version} です。")

display_info()
print(f"プログラムのバージョン: {app_version}")

実行結果:

現在のバージョンは 2.0.1 です。
プログラムのバージョン: 2.0.1

app_versionはグローバルスコープで定義されているため、display_info関数の中から問題なくその値を読み取ることができています。


ルール3:ある関数のローカルスコープは、他の関数のローカルスコープから使えない

関数はそれぞれ独立したローカルスコープを持っています。そのため、ある関数で定義したローカル変数を、別の関数の中から直接使うことはできません。

def function_alpha():
    # function_alpha のローカル変数
    variable_a = "これはAです"
    function_beta()

def function_beta():
    # function_alpha のローカル変数 variable_a にアクセスしようとする
    # 次の行は NameError を引き起こします
    # print(variable_a) 
    variable_b = "これはBです"

# function_alpha() # この行を実行するとエラーになります

function_alphaを実行すると、その中でfunction_betaが呼ばれますが、function_betavariable_aを知らないため、NameErrorが発生します。


ルール4:スコープが異なれば、同じ名前の変数を区別して使える

グローバルスコープとローカルスコープで、同じ名前の変数を定義することができます。その場合、Pythonはこれらを別々の変数として扱います。関数の中ではローカル変数が優先されます。

# グローバル変数を定義
color = "青"

def show_color():
    # 同じ名前のローカル変数を定義
    color = "赤"
    print(f"関数の中の色は「{color}」です。")

def display_global_color():
    print(f"別の関数から見たグローバル色は「{color}」です。")

# 関数を呼び出す
show_color()
display_global_color()

# グローバル変数の値を表示
print(f"グローバルスコयोの色は「{color}」です。")

実行結果:

関数の中の色は「赤」です。
別の関数から見たグローバル色は「青」です。
グローバルスコープの色は「青」です。

show_color関数内でcolorに「赤」を代入しても、それはローカル変数への代入です。グローバル変数のcolorは「青」のままで、影響を受けていないことが分かります。


まとめ

変数のスコープに関する4つの基本ルールを解説しました。

  1. 外からは内を見れない: グローバルスコープからローカル変数は使えません。
  2. 内からは外を読める: ローカルスコープからグローバル変数を読み取れます。
  3. 隣の部屋は見れない: ある関数のローカル変数は、別の関数からは使えません。
  4. 名前が同じでも別物: スコープが違えば、同じ名前でも異なる変数として扱われます。

これらのルールを意識することで、変数がどこで有効なのかを正確に把握し、より堅牢なプログラムを書くことができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次