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

Pythonの名前空間とは?仕組みとスコープの関係をわかりやすく解説

Pythonにおける名前空間の基本

名前空間(namespace)とは、変数名とオブジェクトを対応付ける仕組みであり、スコープ(名前の有効範囲)を実現するための基盤となるものです。Pythonでは、パッケージ、モジュール、クラス、関数、メソッドなど、それぞれが独自の「名前空間」を持ち、その中で変数名が解決されます。

名前空間の生成と破棄

関数やモジュール、パッケージが評価されて実行が始まると、そのための新しい名前空間が作成されます。これは「評価コンテキスト」と捉えると理解しやすいでしょう。そして、関数などの実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も一緒に消えます。

さらに、ローカルな名前空間に目的の名前が存在しない場合に備えて、プログラム全体で共有される「グローバル名前空間」も用意されています。

名前解決の順序

Pythonが変数名を参照する際には、まずローカルな名前空間(関数の本体やモジュールなど)を調べ、そこで見つからなければグローバルな名前空間へと探索範囲を広げます。

より正確には、Pythonは「LEGBルール」に従って名前を解決します。すなわち、Local(ローカル)→ Enclosing(外側の関数)→ Global(グローバル)→ Built-in(組み込み)の順に名前空間を検索し、最初に見つかった名前を採用します。

コード例

x = 10  # グローバル名前空間

def func():
    y = 5  # ローカル名前空間
    print(x + y)  # xはグローバル、yはローカルから解決される

func()  # 出力: 15

変数はどこに作られるのか

通常、変数はローカルな名前空間の中にのみ作成されます。そのため、関数内で代入した変数は、その関数の実行終了とともに失われます。

ただし、global文やnonlocal文を使用することで、ローカル以外の名前空間に変数を作成したり、既存の変数を再束縛したりすることが可能です。global文はモジュールレベル(グローバル名前空間)の変数を操作し、nonlocal文は外側の関数のローカル変数を操作します。

counter = 0

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

increment()
print(counter)  # 出力: 1

まとめ

名前空間はPythonのスコープ機構の中核です。「実行の開始とともに生成され、終了とともに破棄される」「名前はローカルからグローバルへと順に検索される」「通常はローカルに変数が作られるが、global/nonlocal文で制御できる」というポイントを押さえておくと、変数の挙動で混乱することが少なくなります。

  1. Pythonのfilter()関数とは?使い方と実行例をわかりやすく解説

    Pythonのfilter()関数は、リストなどのシーケンスから特定の条件に合う要素だけを抽出(フィルタリング)するための組み込み関数です。フィルタリングの条件は、別途定義した関数の中で記述します。まず条件を定めたユーザー定義関数を作成し、その関数と対象となるリストをfilter()関数に引数として渡すことで、条件を満たす要素だけを取得できます。 基本構文 filter(filter_function, sequence) filter_functionには各要素を判定する関数を、sequenceにはリストやタプルなどのイテラブル(反復可能オブジェクト)を指定します。判定関数がTrueを返

  2. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値