Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの名前空間(Namespace)とは?仕組みをわかりやすく解説

名前空間はスコープを実現する仕組み

Pythonにおける名前空間(Namespace)とは、変数名とオブジェクトを対応付ける「辞書」のようなもので、スコープ(有効範囲)を実現するための基本的な仕組みです。

Pythonでは、パッケージ・モジュール・クラス・関数・メソッドといったそれぞれの構成要素が、独自の名前空間を持っています。変数名の解決(どのオブジェクトを指すのかの判定)は、この名前空間の中で行われます。

名前空間はいつ作られ、いつ消える?

関数やモジュール、パッケージが評価され、実行が開始されるときに、そのための新しい名前空間が生成されます。これは「実行コンテキスト」と考えるとイメージしやすいでしょう。

そして、その関数などの実行が終了すると、対応する名前空間は破棄されます。それに伴い、その中で定義されていた変数も一緒に消えます。これが、ローカル変数が関数の外から参照できない理由です。

名前の検索順序:ローカル → グローバル

変数名を参照するとき、Pythonはまずローカルの名前空間(関数の本体やモジュールなど、現在のスコープ)を調べます。そこに該当する名前が見つからなければ、次にグローバルな名前空間を確認します。

さらに詳しく言えば、Pythonの名前解決は「LEGBルール」と呼ばれる順序で行われます。

  • L(Local):現在の関数内のローカル名前空間
  • E(Enclosing):外側にネストされた関数の名前空間
  • G(Global):モジュールレベルのグローバル名前空間
  • B(Built-in)printlen など、組み込み名前空間

この順番で上から探索し、最初に見つかった名前が使用されます。

変数はどこに作られる?

通常、変数は代入された時点でローカルの名前空間にのみ作成されます。しかし、global 文や nonlocal 文を使うことで、ローカル以外の名前空間(グローバル空間や外側の関数の空間)に変数を作成・更新することも可能です。

counter = 0  # グローバル名前空間に作成

def increment():
    global counter
    counter += 1  # global宣言によりグローバル変数を更新

increment()
print(counter)  # 1

まとめ

名前空間とは、変数名が属する「世界」のようなものです。Pythonでは各パッケージ・モジュール・クラス・関数がそれぞれ独立した名前空間を持ち、実行時に生成され、終了時に破棄されます。名前の参照はローカルから始まり、見つからなければグローバルへと順に探索される——この基本動作を理解しておくと、スコープ関連のバグやエラーの原因を素早く特定できるようになります。

  1. Pythonで関数を定義する方法!defキーワードの基本構文と使い方を解説

    Pythonの関数とは?関数(function)とは、名前を指定して呼び出すことができる、ひとまとまりのコードのことです。関数には処理の対象となるデータ(引数・パラメータ)を渡すことができ、必要に応じて結果(戻り値)を返すことも可能です。なお、関数に渡されるデータはすべて明示的に指定する必要があります。関数を定義する基本構文def function_name():    # 実行したい処理をここに書くPythonでは、defキーワードに続けて半角スペース、関数名、括弧「()」、そしてコロン「:」を記述することで関数を定義します。その次の行には、インデント

  2. Pythonのラムダ関数(lambda)とは?基本構文と使い方を実例付きで解説

    Pythonのラムダ関数(lambda関数)は、実行時にその場で生成される「名前を持たない匿名関数」です。通常、1行で記述され、特定の名前に束縛されることなく定義できます。 ラムダ関数には以下のような特徴があります。 関数の定義をその場で返すことができる return文を含まず、常に式(expression)を評価して結果を返す 関数オブジェクトが期待される場所なら、どこにでもラムダ式を記述できる ラムダ関数を使う場面 ある関数が一度しか使わず、呼び出し箇所も一箇所だけであるような場合、ラムダ関数が便利です。このようなケースでは、わざわざdef文で関数に名前を付けて定義する必要はありません