Pythonモジュールにおける変数スコープの仕組みを徹底解説
名前空間とは何か
Pythonにおいて、スコープは「名前空間(namespace)」という仕組みによって実現されています。パッケージ、モジュール、クラス、関数、メソッドはそれぞれ独自の名前空間を持ち、その中で変数名が解決されます。
関数やモジュール、パッケージが評価(実行)され始めると、新しい名前空間が作成されます。これは「評価コンテキスト」と考えると理解しやすいでしょう。そして実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も同時に消滅します。
さらに、ローカルの名前空間に目的の名前が見つからない場合に参照される「グローバル名前空間」も存在します。
変数はどこに作成されるのか
通常、変数はローカル名前空間の中にのみ作成されます。ただし、global文やnonlocal文を使用することで、ローカル以外の名前空間に変数を作成することも可能です。
スコープ解決とLEGBルール
変数が使われるとき、その値がどこから取得されるべきかを決定する処理を「スコープ解決」と呼びます。Pythonのスコープ解決は、次のLEGBルールに従って行われます。
L:Local(ローカル)
関数(またはラムダ式)内で何らかの形で代入された名前のうち、その関数内でglobal宣言されていないものを指します。
E:Enclosing-function locals(エンクロージング関数のローカル)
内側から外側へ向かって、静的に囲んでいるすべての関数(またはラムダ)のローカルスコープに存在する名前です。
G:Global(モジュールレベル)
モジュールファイルのトップレベルで代入された名前、またはファイル内のdefブロックの中でglobal文を実行して代入された名前を指します。
B:Built-in(組み込み)
組み込み名前モジュールにあらかじめ定義されている名前です。open、range、SyntaxErrorなどが該当します。
LEGBルールのコード例
実際のコードで確認してみましょう。
x = "global" # G: グローバルスコープ
def outer():
y = "enclosing" # E: エンクロージングスコープ
def inner():
z = "local" # L: ローカルスコープ
print(z) # → local(Lが優先)
print(y) # → enclosing(Eを参照)
print(x) # → global(Gを参照)
inner()
outer()
このように、Pythonはローカル → エンクロージング → グローバル → 組み込みの順序で名前を探索し、最初に見つかった値を採用します。この仕組みを理解しておくと、変数の意図しない上書きや参照エラーを防ぎ、より安全で読みやすいコードを書けるようになります。
-
Pythonの関数における変数スコープの仕組みとは?globalキーワードの使い方も解説
Pythonでは、変数は値を代入した時点で定義されます。C言語など多くの言語とは異なり、事前に宣言しておく必要はなく、いきなり変数を使い始めることができるのが特徴です。x = 141ファイルやモジュールのトップレベル(最上位)で定義された変数は「グローバルスコープ」に属し、関数の中からもアクセスできます。なお、良い設計の原則として、変数はその役割を果たすために必要な最小限のスコープにとどめておくことが推奨されています。例:ローカル変数とグローバル変数の違い次のコードを見てみましょう。x = 141 def foo(): x = 424 # ローカル変数 print(x)
-
【Python入門】関数内でグローバル変数を使う方法をわかりやすく解説
「グローバル」と「ローカル」という用語は、スクリプトやプログラム内における変数の有効範囲(スコープ)を表します。グローバル変数とはプログラムのどこからでもアクセスできる変数のことで、ローカル変数はその変数が定義された範囲(関数の中など)からしかアクセスできません。ローカル変数には、グローバルな位置からアクセスすることはできない点に注意しましょう。 グローバル変数とは、関数の外側で定義・宣言された変数のことで、プログラム内のどこからでも自由に利用できます。 ただし、関数のスコープ内に同じ名前の変数が定義されている場合は、グローバル変数の値ではなく、関数内で定義された値が優先して出力されます。 例