Pythonの名前空間と変数のスコープを徹底解説!LEGBルールで名前解決の仕組みを理解しよう
Pythonにおける名前空間(Namespace)とは?
名前空間(Namespace)とは、変数名とその実体(オブジェクト)を対応付ける仕組みであり、スコープを実現するための基盤となるものです。Pythonでは、パッケージ・モジュール・クラス・関数・メソッドといったそれぞれの単位が、独自の「名前空間」を持っています。
関数やモジュール、パッケージが評価されて実行が始まると、そのための名前空間が新しく作成されます。これは「評価コンテキスト」と考えると分かりやすいでしょう。そして、実行が終了すると、その名前空間は破棄され、そこに存在していた変数も一緒に消えます。
さらに、ローカルの名前空間に目的の名前が見つからない場合に参照される、グローバルな名前空間も存在します。
名前解決の流れ:ローカル → グローバル
各変数名は、まずローカルな名前空間(関数本体やモジュールなど)の中で検索され、見つからなければ次にグローバルな名前空間へと探索範囲が広がります。この一連の処理を「名前解決」と呼びます。
また、変数は通常、その変数が定義されたローカルな名前空間の中でのみ作成されます。ただし、global文やnonlocal文を使うことで、ローカル以外の名前空間に変数を作成することも可能です。
スコープ解決の基本ルール「LEGB」
ある変数が使われるとき、その値がどこから来るのかを決める必要があります。これをスコープ解決と呼びます。Pythonのスコープ解決は、以下のLEGBルールに従って行われます。
L:Local(ローカル)
関数(またはラムダ式)の中で何らかの形で代入された名前のうち、その関数内でglobal宣言されていないものを指します。最も優先度の高いスコープです。
E:Enclosing-function locals(エンクロージング関数のローカル)
静的に囲んでいるすべての外側の関数(またはラムダ式)のローカルスコープにある名前です。内側から外側へという順序で探索されます。ネストした関数でよく使われる概念です。
G:Global(グローバル/モジュール)
モジュールファイルのトップレベルで代入された名前、またはファイル内のdefの中でglobal文によって宣言された名前を指します。モジュール全体で共有されるスコープです。
B:Built-in(組み込み)
Pythonの組み込み名前モジュールにあらかじめ用意されている名前です。例として、open、range、SyntaxErrorなどが挙げられます。LEGBの最後に探索されるスコープです。
まとめ
Pythonの名前空間は、パッケージ・モジュール・クラス・関数ごとに独立して生成・破棄される「評価コンテキスト」です。変数の参照はLocal → Enclosing → Global → Built-in(LEGB)の順に行われ、通常はローカルにのみ変数が作られますが、global文やnonlocal文を使えば他のスコープへの影響も可能になります。LEGBルールを正しく理解することで、予期しない変数の挙動を防ぎ、より安全で読みやすいコードを書けるようになります。
-
Pythonの名前空間とスコープの仕組みをわかりやすく解説
Pythonでは、変数・関数・ライブラリ・モジュールなど、さまざまな「名前」を扱います。ところが、使おうとした変数名が、すでに別の変数や関数、メソッドの名前として存在している――そんな場面に遭遇することは珍しくありません。このような名前の衝突を避けるためにも、Pythonがこれらの名前をどのように管理しているのかを理解しておく必要があります。その鍵となるのが「名前空間(namespace)」という概念です。 名前空間の3つの種類 Pythonの名前空間は、大きく次の3つに分類されます。 ローカル名前空間(Local Namespace)関数の中で定義された変数や関数の名前を保持する名前空
-
【Python入門】関数内でグローバル変数を使う方法をわかりやすく解説
「グローバル」と「ローカル」という用語は、スクリプトやプログラム内における変数の有効範囲(スコープ)を表します。グローバル変数とはプログラムのどこからでもアクセスできる変数のことで、ローカル変数はその変数が定義された範囲(関数の中など)からしかアクセスできません。ローカル変数には、グローバルな位置からアクセスすることはできない点に注意しましょう。 グローバル変数とは、関数の外側で定義・宣言された変数のことで、プログラム内のどこからでも自由に利用できます。 ただし、関数のスコープ内に同じ名前の変数が定義されている場合は、グローバル変数の値ではなく、関数内で定義された値が優先して出力されます。 例