Pythonのスコープとは?ローカル変数・グローバル変数の違いと使い分け
生徒
「先生、Pythonで変数を使っていたら、急にエラーが出ました!同じ名前の変数を使っただけなのに…」
先生
「それは“スコープ”の問題かもしれませんね。Pythonでは、変数が“どこで使えるか”がとても重要なんですよ。」
生徒
「“どこで使えるか”?…つまり、使っていい場所が決まってるんですか?」
先生
「その通りです!今回はPythonのスコープ、そしてローカル変数とグローバル変数の違いを、初心者にもわかるようにじっくり解説していきますね。」
1. Pythonのスコープとは?
Pythonのスコープ(scope)とは、変数が有効に使える範囲のことです。簡単に言うと、「この変数はどこで使えるのか?」を決めるルールのことです。
変数はどこで作ったかによって、その使える場所が決まります。これを知っておかないと、「変数が見つからない!」というエラーが出ることがあります。
2. ローカル変数とは?
ローカル変数(local variable)とは、関数の中でだけ使える変数のことです。
例えて言えば、キッチンの中だけで使えるフライパンみたいなものです。キッチン(関数)の外ではそのフライパン(変数)は使えません。
def greet():
message = "こんにちは"
print(message)
greet()
print(message) # ← ここでエラーになります!
こんにちは
NameError: name 'message' is not defined
上の例では、messageはgreet関数の中で作られた変数なので、関数の外では使えません。
3. グローバル変数とは?
グローバル変数(global variable)は、関数の外で作った変数で、プログラムのどこからでも使える変数です。
例えるなら、家じゅうどこでも使える冷蔵庫のような存在です。
message = "おはよう"
def greet():
print(message)
greet()
print(message)
おはよう
おはよう
このように、関数の外で作った変数は、関数の中でも使えます。
4. 関数の中でグローバル変数を変更したいとき
関数の中でグローバル変数を変更したい場合は、globalというキーワードを使います。
ただし、これはちょっと注意が必要です。無闇に使うと、プログラムがわかりにくくなる原因になります。
count = 0
def add():
global count
count += 1
add()
print(count)
1
このように、globalを使えば、関数の中でもグローバル変数を変更できます。
5. なぜローカル変数とグローバル変数を分けるの?
それはバグ(間違い)を防ぐためです。
もしすべての変数がどこでも使えてしまったら、どこで値が変わったのかが分かりづらくなり、プログラムのミスに気付きにくくなってしまいます。
ローカル変数を使えば、関数の中だけの影響で済むので、安心して書けるんですね。
6. 同じ名前の変数があったらどうなる?
ローカル変数とグローバル変数に同じ名前の変数があった場合、Pythonはまずローカル変数を優先して使います。
name = "外の名前"
def show_name():
name = "中の名前"
print(name)
show_name()
print(name)
中の名前
外の名前
このように、nameという変数が関数の中にも外にもありますが、関数の中では中の値が使われます。
7. スコープの基本ルール(LEGB)
Pythonのスコープは、次の順番で探されます。これをLEGBルールといいます。
- L(Local): 関数の中で定義された変数
- E(Enclosing): ネストされた関数の外側
- G(Global): ファイル内で定義されたグローバル変数
- B(Built-in): Pythonにもともとある関数(例:
printやlen)
初心者のうちは、「ローカルとグローバル」の2つを意識しておけば十分です。
8. 実際にスコープのエラーを防ぐためには?
変数をどこで作って、どこで使っているかをしっかり確認することが大切です。
関数の外で使いたい変数なら、外に書く。関数の中だけで使うなら、ローカルにする。このルールを守るだけで、ミスはかなり減ります。
まとめ
今回はPythonのスコープについて、ローカル変数とグローバル変数の違いを中心に学びました。スコープとは変数が「どこで使えるか」を決める大切な仕組みであり、初心者にとって最初に理解すべき重要なポイントです。ローカル変数は関数の中だけで有効で、外では使えません。一方、グローバル変数はプログラム全体で共有されます。さらに、関数の中でグローバル変数を変更したいときは「global」キーワードを使う必要があることも確認しました。これを誤って使うとプログラムの可読性が下がり、バグの原因にもなるため、注意が必要です。
また、同じ名前の変数がローカルとグローバルに存在すると、関数の中ではローカル変数が優先されることも実際のコードで確認しました。Pythonでは「LEGBルール」という基本的な探索順序があり、ローカル、外側の関数、グローバル、ビルトインの順番で変数が探されるというルールを理解することが大切です。この仕組みをしっかり把握しておくことで、プログラムのエラーを防ぎ、より正確で読みやすいコードを書くことができます。
サンプルプログラムを振り返る
ここでもう一度、スコープを意識したシンプルなプログラムをまとめます。ローカル変数とグローバル変数の挙動を比較することで、スコープの考え方を整理できます。
message = "外のあいさつ"
def greet():
message = "中のあいさつ"
print("関数の中では:", message)
greet()
print("関数の外では:", message)
関数の中では: 中のあいさつ
関数の外では: 外のあいさつ
このように、同じ名前の変数を使っていても、スコープによって参照される値が変わります。初心者はまず、関数の中で定義した変数は関数の外では使えない、というシンプルなルールを意識しましょう。
スコープを理解するメリット
スコープを理解することで、次のようなメリットがあります。
- エラーを防ぎ、プログラムが正しく動くようになる
- コードを整理して読みやすくできる
- 関数ごとに役割を明確にでき、プログラムが複雑になっても管理しやすい
- グローバル変数を無闇に使わず、予期せぬバグを防げる
特にPython初心者は「変数はどこで使えるのか?」という視点を持つことが、プログラミングスキルの成長に直結します。
生徒
「先生、最初は同じ変数名を使っても大丈夫だと思っていたけど、スコープの仕組みを知らなかったからエラーが出ていたんですね。」
先生
「そうですね。Pythonではローカル変数とグローバル変数の違いを理解することがとても大切なんです。関数の中でしか使えない変数と、どこでも使える変数をきちんと分けておくと、コードが整理されてエラーも防げます。」
生徒
「LEGBルールも覚えました!ローカル、外側の関数、グローバル、ビルトインの順番で探すんですよね。」
先生
「その通り!その仕組みを知っているだけで、どの変数が参照されるのかを予測できるようになります。これからプログラムを書くときは、スコープを意識して書いてみましょう。」
生徒
「はい!ローカル変数を積極的に使って、必要なときだけグローバル変数を使うように気をつけます!」