Pythonのスコープとは?ローカル変数・グローバル変数の違いと使い分け
生徒
「Pythonで同じ変数名を使ったら、場所によって値が違うときがあるんですが、これはどうしてですか?」
先生
「それは『スコープ』が関係しています。スコープとは変数が有効な範囲のことです。」
生徒
「スコープ?有効な範囲ってどういう意味ですか?」
先生
「変数は宣言された場所によって使える範囲が決まります。関数の中だけで使える変数もあれば、プログラム全体で使える変数もあります。」
生徒
「それがローカル変数とグローバル変数の違いですか?」
先生
「そうです。では具体的に見ていきましょう。」
1. スコープ(有効範囲)とは?
Pythonにおけるスコープ(Scope)とは、一言で言うと「その変数がどこで使えるか?」という変数の有効範囲のことです。
プログラミング初心者の方がよく直面する「さっき定義したはずの変数が使えない(NameError)」というトラブルの多くは、このスコープを正しく理解することで解決できます。Pythonのスコープは、主に以下の2つの階層で整理するのが基本です。
- ローカル変数(Local scope):特定の関数やメソッドの「中」だけで有効な変数です。使い終わるとメモリから消えるため、一時的な作業用データに適しています。
- グローバル変数(Global scope):プログラムの「外側(トップレベル)」で定義され、どこからでも参照できる変数です。
例えば、家の中でしか使えない「リモコン(ローカル)」と、街中で誰もが見られる「看板(グローバル)」の違いをイメージすると分かりやすいでしょう。
Pythonには、この他に「非ローカル変数(Enclosing)」や、最初から用意されている「組み込み(Built-in)」といったスコープもあり、これらを合わせてLEGBルールと呼びます。まずは基本の「中か外か」からマスターしていきましょう。
# --- 関数の外:グローバルスコープ ---
global_val = "私はどこでも見られます"
def my_house():
# --- 関数の中:ローカルスコープ ---
local_val = "私はこの関数の中でしか使えません"
print(local_val) # これはOK
print(global_val) # 外側のものも見ることができます
my_house()
このように、変数がどのエリアに所属しているかを意識することが、バグの少ない綺麗なコードを書くための第一歩となります。
2. ローカル変数(Local Variable)の使い方とエラーの対処法
ローカル変数とは、一言で言うと「関数の中でだけ魔法が効く変数」です。Pythonでは、ある関数の中で作成した変数は、その関数が実行されている間だけメモリ上に存在し、処理が終わると自動的に消滅してしまいます。
プログラミング未経験者の方がよくやってしまうのが、「関数の中で計算した結果を、外側でそのまま使おうとしてエラーになる」というパターンです。まずは、実際にエラーが出るコードを見て、その仕組みを確認しましょう。
def cook_curry():
# 関数の中で定義した「ローカル変数」
secret_ingredient = "リンゴとハチミツ"
print("隠し味は" + secret_ingredient + "です。")
# 関数を呼び出す(実行する)
cook_curry()
# 関数の外側で変数を使おうとすると...?
print(secret_ingredient)
このプログラムを実行すると、以下のような実行結果になります。
隠し味はリンゴとハチミツです。
NameError: name 'secret_ingredient' is not defined
最後に出ているNameErrorは、「その名前の変数は見つかりません(定義されていません)」という警告です。secret_ingredient(隠し味)は、cook_curryというキッチンの中でしか使えないルールになっているため、外の世界(プログラムのメイン部分)からは存在が見えないのです。
「どこでも使える変数」ばかりだと、プログラムが大きくなった時に、別の場所で同じ名前をうっかり使って値を上書きしてしまうミスが多発します。ローカル変数という「限定された範囲」を作ることで、他の処理に影響を与えずに安心して計算ができるようになっているのです。
3. グローバル変数(Global Variable)の役割と活用シーン
グローバル変数とは、関数の外側(プログラムのトップレベル)で定義される変数のことです。ローカル変数が「特定の部屋の中だけで使える道具」なら、グローバル変数は「公園の時計」のように、プログラムのどこからでも参照できる共通の変数といえます。
複数の関数で同じデータを使いたい場合や、プログラム全体の設定値を保持したい場合に非常に便利です。まずは、関数の外で作った変数が、関数の中でどのように読み取られるかを確認してみましょう。
# 関数の外側で定義(グローバル変数)
shop_name = "Pythonカフェ"
def welcome_message():
# 関数の中から外側の変数を参照する
print(shop_name + "へようこそ!")
def show_menu():
# 別の関数からも同じ変数を参照できる
print("本日の" + shop_name + "おすすめメニューは珈琲です。")
# 関数を実行
welcome_message()
show_menu()
# 関数の外側でも当然使える
print("店名は " + shop_name + " です。")
このプログラムの実行結果は以下の通りです。
Pythonカフェへようこそ!
本日のPythonカフェおすすめメニューは珈琲です。
店名は Pythonカフェ です。
このように、グローバル変数は一度定義してしまえば、複数の関数から呼び出して使い回すことができます。初心者の方は、「どこからでも見える便利な共有箱」と覚えるとイメージしやすいでしょう。ただし、どこでも書き換えられてしまうと管理が大変になるため、基本的には「読み取り専用」として使うのが安全なコードへの近道です。
4. 関数内でグローバル変数を書き換える「global宣言」の仕組み
前の章で「グローバル変数は読み取り専用として使うのが安全」とお伝えしましたが、プログラミングをしていると、どうしても「関数の中から外側の変数の値を更新したい」という場面が出てきます。
しかし、Pythonには「関数の中で変数に代入すると、自動的に新しいローカル変数として扱われる」という性質があります。そのため、外側のグローバル変数を直接書き換えたいときは、「この変数は外側のものを使いますよ!」という宣言が必要になります。これがglobalキーワードの役割です。
global宣言を忘れて関数内で計算(代入)しようとすると、Pythonは「新しい別の変数」だと勘違いしてしまい、元のグローバル変数は1ミリも変わりません。
# プログラム全体で共有する「カウンター」
count = 0
def add_count():
# 「外にあるcountを使います」と宣言
global count
# これで外側の変数を直接書き換えられる
count = count + 1
print("関数の中での値:", count)
# 1回実行してみる
add_count()
# 外側で確認しても、ちゃんと値が変わっている!
print("関数が終わった後の外側の値:", count)
このプログラムを実行すると、以下のように出力されます。
関数の中での値: 1
関数が終わった後の外側の値: 1
もしglobal countの一行を消してしまうと、Pythonは「関数の中でだけ使う新しいcount」を作ろうとしますが、まだ中身が決まっていない状態で計算(+1)しようとするため、エラーになってしまいます。このように、「外の箱を直接いじりたい時は、まず名前を呼んであげる(global宣言)」と覚えるのがコツです。
この方法は非常に便利ですが、あちこちの関数でグローバル変数を書き換える設定にすると、「いつの間にか値が変わっていて原因がわからない!」というバグに繋がりやすくなります。アプリの設定値など、本当に必要な場合だけに絞って使うのが、脱・初心者のポイントです。
5. ローカルとグローバルが同じ名前のとき(変数の優先順位)
Pythonを学んでいると、「もし関数の外と中で、たまたま同じ名前の変数を使ってしまったらどうなるの?」という疑問が湧くかもしれません。この場合、Pythonには「より狭い範囲(ローカル)の変数を優先する」という明確なルールがあります。
これをプログラミング用語で「シャドウイング(覆い隠す)」と呼ぶこともあります。外側の広い世界にある変数が、関数の中という狭い世界の変数によって、一時的に隠されてしまうイメージです。初心者が陥りやすいポイントなので、具体的な例で確認してみましょう。
# 1. まずは外の世界で「100」という値を持つ変数を用意
value = 100 # グローバル変数
def my_function():
# 2. 関数の中で、同じ「value」という名前で「50」を代入
# ここで新しい「ローカル変数」が誕生し、外側の100は見えなくなります
value = 50
print("関数の中(ローカル)での値:", value)
# 関数を実行
my_function()
# 3. 関数の外で、改めて値を確認してみる
print("関数が終わった後の外側での値:", value)
このプログラムを実行した結果は、以下のようになります。
関数の中(ローカル)での値: 50
関数が終わった後の外側での値: 100
いかがでしょうか。関数の中で value = 50 と書き換えたように見えますが、実際には「関数専用の同名変数が新しく作られただけ」なので、外側のグローバル変数には1ミリも影響を与えていません。
「同じ名前だから繋がっているはず」と思い込むのがバグの元です。Pythonは、関数内で代入が行われると、それを「その関数専用の独立した変数」として扱います。このように、スコープが分かれているおかげで、他の場所で使われている変数名を気にせずに、自由な名前でプログラムを書くことができるのです。
6. 【実践】スコープを上手に使い分ける3つの鉄則
ここまで「ローカル」と「グローバル」の違いを見てきましたが、実際にプログラムを書くときはどちらを使うべきか迷いますよね。2026年現在のモダンなPython開発では、「影響範囲を最小限に抑えること」が最も重要視されています。初心者が迷わないためのポイントを3つにまとめました。
-
1. 基本は「ローカル変数」を主役にする
変数は、必要な関数の中だけで定義しましょう。使い終わったら消えるため、メモリの節約になり、他のコードへの悪影響を防げます。 -
2. グローバル変数は「定数(動かさない値)」に絞る
消費税率やアプリ名など、プログラム全体で共通して使いたい「変更しない値」に限定して使うのが安全です。 -
3. 意味のある名前を付け、衝突を避ける
tempやdataといった曖昧な名前ではなく、user_nameやtotal_priceなど、中身が想像できる名前にすることで、スコープの混同を防げます。
最後に、良い例と悪い例を比較したサンプルを見てみましょう。
# 【良い例】グローバルは「定数」として使い、計算は「ローカル」で行う
TAX_RATE = 1.1 # 消費税(グローバル定数)
def calculate_price(price):
# 関数の中だけで使う変数(ローカル変数)
total = price * TAX_RATE
return total
print(calculate_price(1000))
このように、「外の情報を読み取るのはOK、でも書き換えるのは自分の部屋(関数)の中だけ」というルールを守るのが、バグを未然に防ぐ最大のSEO(プログラムの健全性向上)対策になります。スコープを正しく理解して、誰が読んでも迷わない綺麗なコードを目指しましょう!
まとめ
Pythonのスコープについて深く理解するためには、ローカル変数とグローバル変数の特徴を丁寧に比較しながら、関数内部と外部での変数の扱われ方を明確に意識することが大切です。特に、同じ変数名であっても宣言場所によって意味が変わるという点は、初心者にとって混乱しやすい部分であり、しっかりと整理しておく必要があります。ローカルスコープは関数内だけで完結し、他の場所に影響を与えないため安全に利用できる一方、グローバルスコープはプログラム全体から参照されるため、便利である反面管理を誤ると予期しない動作につながります。こうした特徴を踏まえながら、適切にスコープを選び分けることがPythonのプログラムを安定させ、読みやすくする重要な技術となります。
また、スコープに関する実例として示した関数内での変数変更やglobalキーワードの使いどころは実務でも頻繁に登場するため、今回の理解を土台として積極的に活用していくと、より高度なPythonプログラミングにも応用が可能になります。とくに名前衝突を避ける工夫や、最小限のグローバル変数運用といった設計の考え方は、規模の大きなシステム開発やチーム開発において欠かせない視点となります。スコープは単なる文法知識ではなく、プログラムの構造そのものを左右する根幹の仕組みであるため、しっかり意識して習得すれば、より柔軟で堅牢なコードを書く力が身につきます。
スコープのポイントを整理したサンプルプログラム
message = "外側のメッセージ"
def show_message():
message = "内側だけで使われるローカルメッセージ"
print("関数内の表示:", message)
def update_message():
global message
message = "更新されたグローバルメッセージ"
show_message()
print("関数外の表示:", message)
update_message()
print("変更後の関数外表示:", message)
このサンプルでは、ローカル変数とグローバル変数の動作の違いを確認でき、スコープの理解を深めるうえで非常に有効です。関数内で変数名が同じでも、外部とは別の値を保持することや、globalキーワードを使うと外側の値を書き換えられることが明確に示されています。スコープの振る舞いを意識しながらコードを読むことで、変数の管理が整理され、プログラム全体の見通しがよくなります。
生徒
「今日の内容で、ローカル変数とグローバル変数の違いがかなり理解できました。特に関数の中と外で同じ名前を使っても別のものになる点が印象に残りました。」
先生
「その理解はとても大事ですね。名前が同じでも場所が違えばまったく別の値として扱われるという仕組みは、Pythonだけでなく多くのプログラミング言語に共通する考え方です。」
生徒
「globalを使うと外側の値を書き換えられる仕組みも面白かったです。でも使いすぎると混乱のもとになると感じました。」
先生
「その通り。グローバル変数は便利だけれど、管理が難しいので慎重に使う必要があります。基本はローカル変数中心で、どうしても必要な場面だけグローバルにするという考えが良いですよ。」
生徒
「はい、これからはスコープを意識しながらコードを書いてみます!」