Python チュートリアル - 名前空間とスコープ
このセクションでは、Python プログラミングで変数の名前空間とスコープを学習します。
Python の名前
Python の名前は、オブジェクトに与えられた識別子です。Python はオブジェクト指向プログラミング言語です。つまり、すべてが Python のオブジェクトであり、オブジェクトにアクセスするために名前が使用されます。
たとえば、変数に値を割り当てた場合 x = 3
。これ 3
はオブジェクトであり、メモリ位置(RAM)に保存されます。このメモリロケーションは、名前 x
でアクセスできる名前付きメモリロケーションです。このオブジェクト 3
のアドレスは、組み込み関数 id()
を使用して取得できます。
x = 3
print("id(3) =", id(3))
print("id(x) =", id(x))
id(3) = 1864160336
id(x) = 1864160336
ここで、オブジェクト 3
は名前 x
のある場所に保存されるため、両方のアドレスは同じです。
x
の値を他の変数に割り当てた場合、例えば y
、x
の値を変更すると、x
は新しいアドレスになり、y
は前の x
のアドレスになります。以下の通りです、
x = 3
print("id(x) =", id(x))
x = 4
print("id(4) =", id(4))
print("id(x) =", id(x))
y = 3
print("id(y) =", id(y))
id(x) = 1864160336
id(4) = 1864160352
id(x) = 1864160352
id(y) = 1864160336
y
のメモリアドレスが x
の古いメモリアドレスと等しいことがわかります。
Python の名前空間
名前空間は名前のコレクションです。名前空間は、オブジェクトへの名前のマッピングであり、そのデータ型は Python の辞書です。名前空間は、プログラムで使用されるすべての名前が一意であることを保証します。
名前空間は、インタープリターの開始時に作成され、プログラムの実行の終了時に削除されます。この名前空間にはすべての組み込み名が含まれているため、たとえば組み込み関数 id()
が必要なときはいつでも、プログラムで直接使用できます。
関数を呼び出すと、定義されたすべての名前を含むローカル名前空間が作成されます。
Python の変数スコープ
プログラムで変数を作成すると、プログラムのすべての部分からその変数にアクセスできない場合があります。これは、変数のスコープのためです。定義されていないネームスペースから変数にアクセスしようとしました。
スコープは、接頭辞なしで名前空間にアクセスできる場所として定義できます。
スコープは次のように分類できます。
- ローカル名前空間 - 関数またはクラスメソッド内のローカル名のコレクション。
- グローバル名前空間 - 現在のモジュールの下にあるグローバル名前空間の名前付きコレクション
- ビルトイン名前空間 -Python ビルトイン名前付きコレクション
関数内で参照を作成すると、最初にローカル名前空間で検索され、次にグローバル名前空間で検索されます。どこにも見つからない場合は、組み込みの名前空間で検索されます。
ネストされた関数を作成すると、ローカルスコープ内に新しいスコープが作成されます。
Python でのスコープとネームスペースの使用
def outer():
x = 12
def inner():
y = 13
z = 14
ここでは、ネストされた関数(別の関数内の関数)が定義されています。変数 y
は内部関数のネストされたローカル名前空間にあり、変数 x
は外部関数のローカル名前空間にあり、変数 z
はグローバル名前空間にあります。
内部関数内にある場合、変数 y
はローカル変数であり、x
は非ローカル、z
はグローバルです。内部関数は、非ローカル変数 x
およびグローバル z
変数にアクセスできません。