Pythonの変数のスコープとは?ローカル変数とグローバル変数の違いを初心者向けに解説
生徒
「先生、Pythonで変数のスコープって何ですか?ローカル変数とかグローバル変数って聞きます」
先生
「スコープは『変数が使える範囲』のことです。ローカル変数は関数の中だけ、グローバル変数はプログラム全体で使える変数ですよ」
生徒
「それぞれどう使い分けるんですか?注意点とかありますか?」
先生
「それは大事な点ですね。まずはローカルとグローバルの違いをわかりやすい例で見ていきましょう!」
1. 変数のスコープとは?
「スコープ」とは、変数が「使える範囲」のことです。プログラムでは、変数をどこで作るかによってローカル変数とグローバル変数に分かれ、それぞれに「見える範囲(スコープ)」があります。
大きな町内会で「この町内だけ使える名前」と「町全体で使える名前」があるイメージです。
2. ローカル変数とは?
ローカル変数は、関数(またはブロックなど)の中でだけ使える変数です。関数を出ると消えてしまう、例えると「部屋の中だけで使えるメモ」です。
def greet():
message = "こんにちは" # ローカル変数
print(message)
greet()
print(message) # ここではエラーになる
実行すると、関数内では「こんにちは」が表示されますが、関数外では使えずエラーになります。
こんにちは
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
NameError: name 'message' is not defined
3. グローバル変数とは?
グローバル変数は、プログラム全体で使える変数です。どの関数からでもアクセスできる「町全体で使える大きな看板」のようなものです。
greeting = "おはよう" # グローバル変数
def say():
print(greeting)
say()
print(greeting)
実行すると、関数内外どちらでも「おはよう」が表示されます。
おはよう
おはよう
4. グローバル変数を関数内で変更したいとき
関数内でグローバル変数を変更したい場合は、global
キーワードを使います。これは「この関数はこの変数を外から使ってね」と宣言する感じです。
count = 0
def increment():
global count
count += 1
increment()
increment()
print(count) # 2になります
global
を使わないと、関数内で新しいローカル変数が作られてしまい、混乱する原因になります。
5. スコープと名前解決のルール(LEGBルール)
PythonにはLEGB
という「名前を探す順番」の決まりがあります:
- Local(ローカル)— 関数内
- Enclosing(ネストされた関数の外側)
- Global(グローバル)— モジュール全体
- Built‑in(ビルトイン)— Pythonが初めから持っている
この順番で名前を探し、最初に見つかった場所の変数を使います。だから、同じ名前でも場所によって意味が変わることがあります。
6. 実際の例:名前の衝突に注意!
例えば、グローバルにx
、そして関数内にもx
があるとどうなるか見てみましょう。
x = "グローバル"
def f():
x = "ローカル"
print(x)
f()
print(x)
出力は「ローカル」「グローバル」です。それぞれ別物として扱われています。
ローカル
グローバル
これがスコープの重要なポイントです。同じ名前でも別々の意味を持てるため、使い分けが必要です。
7. スコープの活用でプログラムをスッキリさせよう
スコープを理解すると、不要なグローバル変数を減らして安全にコードが書けます。ローカル変数を使えば、他の部分に影響を与えずに済むため、バグが減って読みやすくなります。
例えば、設定値や状態をグローバルに保管しすぎると、予想外の動きになることがあります。スコープを分けて考えることで「この変数はここだけ使う」と明確にできます。
8. ネスト(入れ子)とスコープ
関数の中にさらに関数を作ると、外側の関数の変数を使うケースがあります。このときもスコープが重要です。
def outer():
msg = "外のメッセージ"
def inner():
print(msg) # enclosingスコープのmsgを使う
inner()
outer()
この例では、inner関数がouterのmsg
を使えます。これは「ネストされた関数の外側」がスコープに含まれているため可能です。