Pythonの変数スコープとは?初心者でもわかるローカル変数とグローバル変数の違い
生徒
「Pythonで変数を作ったのに、別の場所で使えなかったんです。どうしてですか?」
先生
「それは『スコープ』の問題かもしれないね。スコープとは、変数が使える範囲のことなんだ。」
生徒
「スコープって、難しそう…。プログラミングもパソコンも初めてなので、わかるか不安です。」
先生
「大丈夫。スコープは日常のたとえで説明するととてもわかりやすいから、一緒にゆっくり学んでいこう!」
1. Pythonの変数とスコープとは?
Python(パイソン)では、変数とは「情報を入れておく名前のついた箱」のようなものです。
たとえば、name = "さくら"と書くと、「name」という名前の箱に「さくら」という情報が入ります。
でも、この変数がどこからでも使えるとは限りません。変数が使える範囲を「スコープ」と呼びます。
たとえば、学校のロッカーは、その学校の生徒だけが使えるように、Pythonでも変数によって「使える場所」が決まっています。
2. ローカル変数とは?関数の中だけで使える変数
ローカル変数(local variable)は、関数の中で作られた変数で、その関数の中でしか使えません。
たとえば、家の中だけで使えるテレビのリモコンのように、外では使えないというイメージです。
def greet():
name = "たかし"
print("こんにちは、" + name)
greet()
print(name) # ここではエラーになります
こんにちは、たかし
NameError: name 'name' is not defined
このように、nameという変数は関数の中でしか使えません。関数の外で使おうとすると、Pythonは「そんな変数は知らないよ」と言ってエラーになります。
3. グローバル変数とは?どこからでも使える変数
グローバル変数(global variable)は、関数の外で作られた変数です。これはプログラムのどこからでも使えます。
たとえるなら、教室の黒板に書いたメモのようなもので、誰でも見たり使ったりできます。
school = "サクラ小学校"
def show_school():
print("通っている学校は" + school + "です")
show_school()
通っている学校はサクラ小学校です
このように、schoolという変数は関数の外で作られたので、関数の中からでも見ることができます。
4. グローバル変数を関数の中で書き換えるには?
関数の中でグローバル変数の中身を変えたいときは、globalという特別な言葉を使います。
counter = 0
def add_one():
global counter
counter = counter + 1
add_one()
print(counter)
1
global counterと書くことで、「このcounterは外にある変数ですよ」とPythonに伝えることができます。
これを忘れると、Pythonは「これは関数の中で新しく作られたローカル変数だ」と思い込んでしまい、エラーになります。
5. なぜスコープを理解することが大切なの?
スコープを知らずにプログラムを書くと、「思ったとおりに動かない」「エラーになる」といったトラブルが起こります。
たとえば、こんな例です。
total = 50
def update_total():
total = total + 10
update_total()
UnboundLocalError: local variable 'total' referenced before assignment
このエラーは、「関数の中でtotalを使おうとしたけど、ローカル変数として見つからなかった」という意味です。
このようなときはglobalを使って、外の変数を使うことを明示すれば解決できます。
6. ローカル変数とグローバル変数の違いを身近なたとえで理解しよう
ローカル変数は、家の中だけで使うもの(たとえばリモコンやおもちゃ)です。
グローバル変数は、みんなで使えるもの(たとえば学校の黒板やチャイム)です。
このように、「どこで使えるのか?」を意識するだけで、プログラムのエラーを減らすことができます。
スコープは、プログラミングをするときの「交通ルール」のようなものです。しっかり覚えて、安全に楽しくPythonを使いましょう!
まとめ
Pythonの変数スコープについて学んできた内容をふりかえりながら、ローカル変数とグローバル変数の違い、スコープがなぜ重要なのかをより深く理解できるように整理していきます。プログラミングにおけるスコープは、変数の使える範囲を正しく判断するために欠かせない概念であり、Python初心者がつまずきやすい部分でもあります。スコープを正しく理解することで、自分が書いたコードがどのように動くのかが明確になり、エラーの原因を冷静に追いかけられるようになります。ローカル変数は関数の中でしか使えず、外からは見えない特性を持っています。一方でグローバル変数はプログラム全体から参照でき、関数の内部でも使えるので便利に思えますが、書き換えには注意が必要であり、globalを使わないと意図した動作にならないことがあります。 スコープを理解するためには、まず「変数がどこで作られたか」を意識することが第一歩です。たとえば、関数の中に書かれた変数はその関数だけの特別な空間に属しており、外側からは見えません。それはまるで家の中に置いてあるリモコンが外では使えないのと同じです。一方で、グローバル変数は教室の黒板のようにだれでも見ることができるため、プログラムの中のどこからでも参照できます。しかし、黒板に書いた内容を勝手に書き換えると混乱が起きるように、グローバル変数の扱いには慎重さが必要です。 ふだんPythonでコードを書くとき、変数が予期せず上書きされてしまったり、関数の外にあるつもりだった変数が実はローカル変数として扱われていてエラーにつながることもあります。とくにUnboundLocalErrorは初心者がよく遭遇するエラーで、関数の内部で変数を使おうとしたときにPythonが「これはローカル変数だ」と判断しながらも実際には値が設定されていない場合に発生します。こうしたエラーの仕組みを理解しておくことで、自分のコードを読み解く力がつき、より安全で正確なプログラムを書けるようになります。 また、スコープの理解はPython以外の言語を学ぶ際にも役に立ちます。ほとんどのプログラミング言語にはスコープの考え方があり、ローカル変数とグローバル変数という区別も共通して見られます。Pythonでの経験を通じて、関数がどのように値を受け取り、どのように戻り値を返すのか、どの変数がどこで参照されるべきなのかを体系的に理解しておくことは、プログラミング全体の基礎力向上に大きく貢献します。 次のサンプルプログラムでは、ローカル変数とグローバル変数の使い分け、そしてglobalを使った書き換えの流れを確認できます。記事で学んだ内容を実際のコードとして見比べることで、より深く理解できるはずです。
ローカル変数とグローバル変数を確認できるサンプルコード
counter = 0
class ScoreBoard:
school = "サクラ小学校"
def __init__(self):
self.local_count = 0
def add_local(self):
self.local_count = self.local_count + 1
print("ローカルスコア:", self.local_count)
def add_global(self):
global counter
counter = counter + 1
print("グローバルスコア:", counter)
board = ScoreBoard()
board.add_local()
board.add_local()
board.add_global()
board.add_global()
このコードでは、ScoreBoardというクラスの中でローカルスコアとグローバルスコアを別々に管理しています。ローカル変数はインスタンスごとに独立して値を持つことができ、使うたびに自分だけの値が増えていきます。一方のグローバル変数はプログラム全体でひとつしか存在せず、どの関数からも参照できますが、書き換えるにはglobalを明示してPythonに意図を伝える必要があります。こうした動作を体験することで、Pythonの変数スコープが日常の道具のように身近な概念として理解できます。 スコープの理解は、ただ暗記するのではなく、実際のコードを書いて触れることで深まります。今回のまとめでも見たように、ローカル変数とグローバル変数はそれぞれに役割があり、正しく使い分けることで安全なコードが書けます。特にグローバル変数の扱いは便利な反面、予期しない上書きを引き起こす可能性があるため、必要な場面に限定して使うことが大切です。その点を意識しておくだけでも、プログラムの安定性は大きく向上します。 以上のように、スコープはプログラミングにおける基本でありながら奥深いテーマです。Pythonを学び始めたばかりの方でも、身近な例と一緒に覚えることで自然と理解できるようになりますので、ぜひ今回の内容を参考にしながら、コードを書くたびに「この変数はどこで使えるのだろう?」と意識してみてください。これを習慣にすることで、今後のPython学習がよりスムーズになり、自分の思い描いたとおりにプログラムを動かす力が身についてきます。
生徒
「先生、ローカル変数とグローバル変数の違いがやっと分かりました!場所によって使える変数が変わるんですね。」
先生
「その通りです。とくに関数の中で変数を書き換えたいときにはglobalを使う必要があることもポイントですよ。」
生徒
「エラーが出ていた理由も理解できました。関数の中で使ったtotalがローカルとして扱われていたんですね。」
先生
「ええ、そこを意識できるようになるとPythonの読みやすさや理解が一気に深まりますよ。スコープを理解することはとても大切です。」
生徒
「これからはコードを書くときに、変数がどこで使えるのかしっかり考えて書いてみます!」