Pythonの名前空間とスコープの仕組みをわかりやすく解説
Pythonでは、変数・関数・ライブラリ・モジュールなど、さまざまな「名前」を扱います。ところが、使おうとした変数名が、すでに別の変数や関数、メソッドの名前として存在している――そんな場面に遭遇することは珍しくありません。このような名前の衝突を避けるためにも、Pythonがこれらの名前をどのように管理しているのかを理解しておく必要があります。その鍵となるのが「名前空間(namespace)」という概念です。

名前空間の3つの種類
Pythonの名前空間は、大きく次の3つに分類されます。
ローカル名前空間(Local Namespace)
関数の中で定義された変数や関数の名前を保持する名前空間です。関数が呼び出されたときに作成され、関数の実行が終わると同時に破棄されます。
グローバル名前空間(Global Namespace)
モジュール(プログラムファイル)のトップレベルで定義された変数や関数の名前を保持します。プログラムの実行中は常に存在し、モジュール内のどこからでも参照できる名前がここに登録されます。
ビルトイン名前空間(Built-in Namespace)
最上位に位置する名前空間です。
print()やlen()といった組み込み関数、例外クラスなど、Pythonインタープリタがあらかじめ提供している名前が含まれ、インタープリタの起動とともに作成されます。
これらの名前空間は階層構造になっており、ビルトイン名前空間がグローバル名前空間を包含し、さらにグローバル名前空間がローカル名前空間を包含する関係になっています。
スコープ(Scope)とは
名前空間には有効期間があります。この「名前が有効である範囲」のことをスコープと呼びます。スコープは、変数やオブジェクトがコード上のどの位置に書かれているかによって決まります。
基本的なルールとして、内側のスコープから外側のスコープの名前は参照できますが、外側から内側の名前を参照することはできません。また、モジュールのトップレベルで定義した名前はグローバル変数として扱われます。
なお、Pythonがある名前を探すときは、「ローカル → エンクロージング(外側の関数)→ グローバル → ビルトイン」の順(LEGBルール)で検索が行われます。
サンプルコード
prog_var = 'Hello'
def outer_func():
outer_var = 'x'
def inner_func():
inner_var = 'y'
print(dir(), '- inner_func のローカル変数')
inner_func()
print(dir(), '- outer_func のローカル変数')
outer_func()
print(dir(), '- グローバル変数')
このコードを実行すると、次のような結果が出力されます。
実行結果
['inner_var'] - inner_func のローカル変数 ['inner_func', 'outer_var'] - outer_func のローカル変数 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'outer_func', 'prog_var'] - グローバル変数
結果の読み方
dir() 関数は、現在のスコープで参照できる名前の一覧を返します。実行結果からは次のことが読み取れます。
- inner_func の中:自分のローカル変数
inner_varだけが見えています。 - outer_func の中:自分のローカル変数
outer_varに加え、内側で定義した関数inner_funcも参照できます。 - グローバルスコープ:トップレベルで定義した
prog_varやouter_funcに加え、__name__などインタープリタが自動的に用意する特殊な名前も含まれています。
このように、スコープは内側から外側へは開かれていますが、外側から内側へは閉じています。名前空間とスコープの仕組みを理解しておけば、変数名の衝突によるバグを防ぎ、より安全で読みやすいコードを書けるようになります。
-
Pythonの名前空間とは?仕組みとスコープの関係をわかりやすく解説
Pythonにおける名前空間の基本名前空間(namespace)とは、変数名とオブジェクトを対応付ける仕組みであり、スコープ(名前の有効範囲)を実現するための基盤となるものです。Pythonでは、パッケージ、モジュール、クラス、関数、メソッドなど、それぞれが独自の「名前空間」を持ち、その中で変数名が解決されます。名前空間の生成と破棄関数やモジュール、パッケージが評価されて実行が始まると、そのための新しい名前空間が作成されます。これは「評価コンテキスト」と捉えると理解しやすいでしょう。そして、関数などの実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も一緒に消えます。さらに、ロー
-
Pythonの変数入門:宣言方法と使い方を徹底解説
本記事では、Pythonにおける変数の作成方法と基本的な使い方について、初心者にもわかりやすく解説します。 Pythonの変数とは 変数(Variable)とは、メモリ上に格納されたオブジェクトへの参照を保存するための「名前が付けられた場所」のことです。プログラムの中でデータを扱う際の基本となる概念です。 Pythonで変数を作成する際には、以下の命名ルールを守る必要があります。 変数名は英字またはアンダースコア(_)で始める必要がある 変数名を数字で始めることはできない 変数名に使用できるのは英数字とアンダースコアのみ(A-z、0-9、_) 変数名は大文字・小文字が区別される(date、D