Python チュートリアル - 名前空間とスコープ

胡金庫 2023年1月30日
  1. Python の名前
  2. Python の名前空間
  3. Python の変数スコープ
  4. Python でのスコープとネームスペースの使用
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 の値を他の変数に割り当てた場合、例えば yx の値を変更すると、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 の変数スコープ

プログラムで変数を作成すると、プログラムのすべての部分からその変数にアクセスできない場合があります。これは、変数のスコープのためです。定義されていないネームスペースから変数にアクセスしようとしました。

スコープは、接頭辞なしで名前空間にアクセスできる場所として定義できます。

スコープは次のように分類できます。

  1. ローカル名前空間 - 関数またはクラスメソッド内のローカル名のコレクション。
  2. グローバル名前空間 - 現在のモジュールの下にあるグローバル名前空間の名前付きコレクション
  3. ビルトイン名前空間 -Python ビルトイン名前付きコレクション

関数内で参照を作成すると、最初にローカル名前空間で検索され、次にグローバル名前空間で検索されます。どこにも見つからない場合は、組み込みの名前空間で検索されます。

ネストされた関数を作成すると、ローカルスコープ内に新しいスコープが作成されます。

Python でのスコープとネームスペースの使用

def outer():
    x = 12

    def inner():
        y = 13


z = 14

ここでは、ネストされた関数(別の関数内の関数)が定義されています。変数 y は内部関数のネストされたローカル名前空間にあり、変数 x は外部関数のローカル名前空間にあり、変数 z はグローバル名前空間にあります。

内部関数内にある場合、変数 y はローカル変数であり、x は非ローカル、z はグローバルです。内部関数は、非ローカル変数 x およびグローバル z 変数にアクセスできません。

著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook