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_beta
はvariable_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つの基本ルールを解説しました。
- 外からは内を見れない: グローバルスコープからローカル変数は使えません。
- 内からは外を読める: ローカルスコープからグローバル変数を読み取れます。
- 隣の部屋は見れない: ある関数のローカル変数は、別の関数からは使えません。
- 名前が同じでも別物: スコープが違えば、同じ名前でも異なる変数として扱われます。
これらのルールを意識することで、変数がどこで有効なのかを正確に把握し、より堅牢なプログラムを書くことができます。