【第25回Python基礎講座】変数の有効範囲!スコープと名前空間

本ページはプロモーションが含まれています
【第25回Python基礎講座】変数の有効範囲!スコープと名前空間
国内のAI狂い

やっほー!国内のAI狂いだよ!✨

ついに来たね、第25回!最終回だよ〜!!🎉😭
ここまでついてきてくれて本当にありがとう!
最後を飾るテーマは、変数の「縄張り」を決める「スコープ(有効範囲)」
「関数の中で変えたのに、外に戻ったら元通りになってる!?」なんてバグに泣かされないよう、Pythonのルールの核心を理解して卒業しよう!🎓✨

公式の「ここがわかりにくい」:名前空間ってどこ?

公式ドキュメントには、こんな抽象的な説明があるよ。

名前空間 (namespace) とは、名前からオブジェクトへの対応付け (mapping) です。(中略) スコープ (scope) とは、ある名前空間が直接アクセスできるような、Python プログラムのテキスト上の領域です。

「名前空間」って聞くと宇宙っぽいけど、要するに「変数の名前を書いた名札が入っている箱」のこと。
「Aさんの家のポチ」と「Bさんの家のポチ」が別の犬であるように、箱(名前空間)が違えば同じ名前の変数でも別物として扱われるんだ。
そして「スコープ」は、「今、どの箱の中身が見えるか(手が届くか)」という範囲のことだよ!

1. 家の中(ローカル)と外の世界(グローバル)

要するにこれは「関数の中だけの変数と、プログラム全体の変数」の違いだよ!

Pythonには大きく分けて2つのスコープがあるよ。

  • グローバルスコープ:関数の外側。どこからでも見える。
  • ローカルスコープ:関数の中。その関数の中からしか見えない。
🐍 実験コードを見る(クリックで開閉)
# グローバル変数(どこでも使える)
message = "Global"

def my_func():
    # ローカル変数(この関数内だけ!)
    secret = "Local"
    print(f"関数の中: {message} と {secret}")

my_func()

print(f"関数の外: {message}")

# 関数の外からローカル変数は見えない!
# print(secret)  # -> NameError になる!
💻 実行結果:
関数の中: Global と Local
関数の外: Global

関数の中で message = "New" と書くと、グローバル変数を書き換えるのではなく、「同じ名前の新しいローカル変数」が作られる点に注意!

2. global文:外の世界を書き換えろ!

「関数の中から、外にあるグローバル変数を書き換えたい!」って時はどうする?
普通に代入するとローカル変数が作られちゃうから、global キーワードを使って宣言するんだ。

🐍 書き換え実験(クリックで開閉)
score = 0

def update_score():
    # 「この score は外のやつを使うよ!」と宣言
    global score
    score = 100
    print(f"関数内: {score}")

print(f"実行前: {score}")
update_score()
print(f"実行後: {score} (変わった!)")
💻 実行結果:
実行前: 0
関数内: 100
実行後: 100 (変わった!)
【注意】 global は便利だけど、使いすぎると「どこで変数が書き換わったか分からない」バグの温床になるから、乱用は禁物だよ!

3. nonlocal文:一つ外側の世界へ

関数の中に関数がある(入れ子/ネスト)場合、「一つ外側の関数の変数」を書き換えたい時があるよね。
そんな時に使うのが nonlocal キーワードだよ。

🐍 入れ子関数の実験(クリックで開閉)
def outer():
    x = "Outer"
    
    def inner():
        # 一つ外側(outer)の x を使う宣言
        nonlocal x
        x = "Inner"
        print(f"inner: {x}")
    
    inner()
    print(f"outer: {x} (書き換わった!)")

outer()
💻 実行結果:
inner: Inner
outer: Inner (書き換わった!)

global は一番外(トップレベル)まで行っちゃうけど、nonlocal は「親関数」の変数を触りに行くイメージだね。

4. 【最重要】名前を探す順番:LEGBルール

要するにこれは「Pythonが変数を見つける時の優先順位」だよ!

Pythonが変数名を見つける時、以下の順番で探していくよ。
頭文字を取ってLEGBルールって呼ばれているんだ。

  1. Local (ローカル):今の関数の中
  2. Enclosing (エンクロージング):外側の関数の中(入れ子の場合)
  3. Global (グローバル):モジュールのトップレベル
  4. Built-in (ビルトイン):組み込み(lenとかprintとか)

「近くから順に探して、見つかったらそこでストップ」するよ。
だから、ローカル変数で len = 10 とか定義しちゃうと、組み込み関数の len() が隠れて使えなくなっちゃうんだ(これを「シャドーイング」と言うよ)。

試験に出る!要注意ポイント

今回の範囲で、Python 3 エンジニア認定基礎試験によく出るポイントをまとめたよ!📝

① UnboundLocalError の罠

以下のコード、エラーになるんだけど理由がわかる?

a = 10
def func():
    print(a)  # グローバルの10を表示したい...
    a = 20    # でもここで代入してる!

Pythonは、関数内のどこかで代入されている変数は、その関数内すべての場所で「ローカル変数」とみなすんだ。
だから print(a) の時点で「まだ定義されてないローカル変数 a を使おうとした!」って怒られちゃうの(UnboundLocalError)。
これを防ぐには global a 宣言が必要だよ。

💡 管理人の失敗エピソード
nonlocal っていつ使うの?」ってずっと思ってたんだけど、クロージャ(状態を保持する関数)を作る時に必須なんだよね。
カウンター関数を作ろうとして count += 1 したらエラーになって、「なんで!?外にあるじゃん!」って叫んだ思い出…。
参照するだけならOKだけど、書き換えるなら宣言が必要ってこと、忘れがちだから気をつけて!

理解度チェック!ミニクイズ

スコープのルール、理解できたかな?
最後のクイズ、全問正解して卒業しよう!🎓

次のコードの実行結果は?
x = 10
def f():
  x = 20
  print(x, end="")
f()
print(x)
  1. 1010
  2. 2010
  3. 2020
▼ クリックで正解を表示
正解: 2. 2010

解説:
関数内の x = 20 はローカル変数の定義になるから、グローバルの x には影響しないよ。
だから関数内では20、外では元の10が表示されるんだ。

入れ子の関数(内側の関数)から、一つ外側の関数の変数を書き換えるためのキーワードは?
  1. global
  2. super
  3. nonlocal
▼ クリックで正解を表示
正解: 3. nonlocal

解説:
global は一番外(グローバルスコープ)、nonlocal は直近の外側(エンクロージングスコープ)を指すよ。

Pythonが変数名を探す順番(LEGBルール)として正しいのは?
  1. Local -> Enclosing -> Global -> Built-in
  2. Global -> Local -> Built-in -> Enclosing
  3. Built-in -> Global -> Enclosing -> Local
▼ クリックで正解を表示
正解: 1. Local -> Enclosing -> Global -> Built-in

解説:
「近いところから探して、なければ外へ」という順番だよ。
一番外側が組み込み(Built-in)だね。

まとめ:卒業おめでとう!

これで第25回、Python基礎講座は完結だよ!🎉
ここまで読んでくれて本当にありがとう!
最初は「黒い画面怖い…」って言ってたかもしれないけど、今はもう「モジュール」「クラス」「スコープ」なんて言葉も使いこなせる立派なPython使いだね!🐍✨

この講座の内容が頭に入っていれば、Python 3 エンジニア認定基礎試験の合格ラインは余裕でクリアできる実力がついてるはず。
自信を持って試験に挑んでね!
これからも、コードを書いて書いて書きまくって、楽しいPythonライフを送ってね!応援してるよ!
それじゃあ、またどこかで!バイバーイ!👋💖

出典: Python公式チュートリアル
Copyright © 2001-2026 Python Software Foundation. Licensed under the PSF License.

よかったらシェアしてね!
  • URLをコピーしました!
目次