Pythonの名前空間(Namespace)とは?仕組みをわかりやすく解説
名前空間はスコープを実現する仕組み
Pythonにおける名前空間(Namespace)とは、変数名とオブジェクトを対応付ける「辞書」のようなもので、スコープ(有効範囲)を実現するための基本的な仕組みです。
Pythonでは、パッケージ・モジュール・クラス・関数・メソッドといったそれぞれの構成要素が、独自の名前空間を持っています。変数名の解決(どのオブジェクトを指すのかの判定)は、この名前空間の中で行われます。
名前空間はいつ作られ、いつ消える?
関数やモジュール、パッケージが評価され、実行が開始されるときに、そのための新しい名前空間が生成されます。これは「実行コンテキスト」と考えるとイメージしやすいでしょう。
そして、その関数などの実行が終了すると、対応する名前空間は破棄されます。それに伴い、その中で定義されていた変数も一緒に消えます。これが、ローカル変数が関数の外から参照できない理由です。
名前の検索順序:ローカル → グローバル
変数名を参照するとき、Pythonはまずローカルの名前空間(関数の本体やモジュールなど、現在のスコープ)を調べます。そこに該当する名前が見つからなければ、次にグローバルな名前空間を確認します。
さらに詳しく言えば、Pythonの名前解決は「LEGBルール」と呼ばれる順序で行われます。
- L(Local):現在の関数内のローカル名前空間
- E(Enclosing):外側にネストされた関数の名前空間
- G(Global):モジュールレベルのグローバル名前空間
- B(Built-in):
printやlenなど、組み込み名前空間
この順番で上から探索し、最初に見つかった名前が使用されます。
変数はどこに作られる?
通常、変数は代入された時点でローカルの名前空間にのみ作成されます。しかし、global 文や nonlocal 文を使うことで、ローカル以外の名前空間(グローバル空間や外側の関数の空間)に変数を作成・更新することも可能です。
counter = 0 # グローバル名前空間に作成
def increment():
global counter
counter += 1 # global宣言によりグローバル変数を更新
increment()
print(counter) # 1まとめ
名前空間とは、変数名が属する「世界」のようなものです。Pythonでは各パッケージ・モジュール・クラス・関数がそれぞれ独立した名前空間を持ち、実行時に生成され、終了時に破棄されます。名前の参照はローカルから始まり、見つからなければグローバルへと順に探索される——この基本動作を理解しておくと、スコープ関連のバグやエラーの原因を素早く特定できるようになります。
-
Pythonで関数を定義する方法!defキーワードの基本構文と使い方を解説
Pythonの関数とは?関数(function)とは、名前を指定して呼び出すことができる、ひとまとまりのコードのことです。関数には処理の対象となるデータ(引数・パラメータ)を渡すことができ、必要に応じて結果(戻り値)を返すことも可能です。なお、関数に渡されるデータはすべて明示的に指定する必要があります。関数を定義する基本構文def function_name(): # 実行したい処理をここに書くPythonでは、defキーワードに続けて半角スペース、関数名、括弧「()」、そしてコロン「:」を記述することで関数を定義します。その次の行には、インデント
-
Pythonのラムダ関数(lambda)とは?基本構文と使い方を実例付きで解説
Pythonのラムダ関数(lambda関数)は、実行時にその場で生成される「名前を持たない匿名関数」です。通常、1行で記述され、特定の名前に束縛されることなく定義できます。 ラムダ関数には以下のような特徴があります。 関数の定義をその場で返すことができる return文を含まず、常に式(expression)を評価して結果を返す 関数オブジェクトが期待される場所なら、どこにでもラムダ式を記述できる ラムダ関数を使う場面 ある関数が一度しか使わず、呼び出し箇所も一箇所だけであるような場合、ラムダ関数が便利です。このようなケースでは、わざわざdef文で関数に名前を付けて定義する必要はありません