Pythonネーミングスペースと役割ドメイン


ネームスペース
  • 名前空間(namespaces):名前とメモリアドレスのバインド関係を格納する場所であり、スタック領域の区分
  • である.
  • の役割:名前空間はスタック領域に同じ名前を格納し、名前の競合
  • を解決することができる.
  • 名前空間は3種類に分けられます.
  • 内蔵ネームスペース
  • グローバルネームスペース
  • ローカルネームスペース

  • 内蔵ネームスペース
  • 内蔵ネームスペース:Pythonインタプリタに内蔵された名前を格納するための
  • ライフサイクル:Pythonインタプリタが起動すると生成され、Pythonインタプリタが閉じると
  • が破棄されます.
  • 例えば、printinputint

  • グローバルネームスペース
  • グローバルネームスペース:トップコードを実行することによって生成された名前、または関数内の定義および内蔵を除いて、残りはグローバルネームスペース
  • である.
  • ライフサイクル:Pythonファイルの実行時に発生し、Pythonファイルの実行が完了すると
  • が破棄されます.
  • 例えば
  • #    a
    a = 1
    
    #    func
    def func():
        pass
    
    #   MyClass
    class MyClass:
        pass

    ローカルネームスペース
  • ローカルネーミングスペース:関数を呼び出すときに、関数体コードを実行するときに生成される関数内の名前
  • ライフサイクル:関数呼び出し時に発生し、関数呼び出しが完了すると
  • が破棄されます.
  • 例えば
  • def func(x, y):
        pass
    
    func(1, 2)

    ネームスペースの優先順位
  • ネームスペースのロード順序:内蔵ネームスペース->グローバルネームスペース->ローカルネームスペース
  • ネームスペース破棄順序:ローカルネームスペース->グローバルネームスペース->内蔵ネームスペース
  • 名前の検索優先度:現在の場所から上のレベルへ
  • を検索
    アクティブドメイン
    グローバル役割ドメイン
  • グローバル役割ドメイン:内蔵ネームスペース、グローバルネームスペース
  • 特徴:
  • グローバル生存
  • グローバル有効:すべての関数によって共有される

  • ローカルスコープ
  • ローカル役割ドメイン:ローカル名空間
  • 特徴:
  • 仮生存
  • ローカル有効:関数内有効

  • LEGB原則
    変数の呼び出し順序を探すにはLEGB原則(すなわち近接原則)B-Builtin(Python)を採用する.Python内蔵モジュールのネーミングスペース(内蔵ドメイン)G-Global(module);関数の外部にあるネーミングスペース(グローバル役割ドメイン)E--Enclosing function locals;外部ネスト関数の作用域(ネスト作用域)L——Local(function);現在の関数内の役割ドメイン(局所役割ドメイン)は,近接の原則に基づいて,下から上へ内側から外側へ順次探す.
    globalとnonlocal
  • global:グローバル変数の変更を宣言する
  • グローバル変数
  • nonlocal:ローカル変数(現在の関数の上のレイヤのローカル変数)
  • を変更する
    # global   
    x = 1
    def func():
        global x
        x = 2
    func()
    print(x)
    
    # nonlocal   
    def func1():
        x = 1
        def func2():
            nonlocal x
            x = 2
        func2()
        print(x)
    func1()

    まとめ
  • 名前空間はスタックの区分であり、本当に存在するのはスタック領域である.ネームスペースは仮想的な区分
  • にすぎません
  • 名前空間は優先度の区分のみであり、ネスト関係はない
  • 名前空間の「ネスト関係」は名前の検索順序
  • を決定する.
  • ネームスペースのネスト関係は、関数定義フェーズに準拠する
  • です.