Pythonのスコープと名前空間
名前空間には、 オブジェクトへの名前のマッピングです。
名前空間は、オブジェクトに名前からマッピング(点、明確なパス)です。
ほとんどの名前空間は、現在、Pythonの辞書として実装されています。
それらのほとんどは、辞書dictの(もハッシュとして知られている他の言語)によって実装されています。
例:
内蔵された名前のセット。組み込み関数のセットを配置します。グローバル・ネーム・モジュール、関数呼び出しのローカル名。ある意味では、オブジェクトのコレクションの特性はまた、スペースに名前を付けるの一形態です。
名前空間別の名前空間の名前の間には全く関係がないことです。
同じ名前で別の名前空間の名前の間に何の関係が、異なる名前空間には何の関係もありません、ありません。
ライフサイクル寿命。
名前空間は異なる瞬間に作成され、異なる寿命を持っています。
例えば:
モジュールのグローバルな名前空間は、モジュール定義が読み込まれたときに作成され、インタプリタ終了するまで継続されます。内蔵の名前は、実際にあるモジュールの組み込みコマンドに存在します。
ローカル名前空間の機能は、関数が返すまたはスローが❌関数内で処理されていないとき、それが削除され、関数が呼び出されたときに作成されます。
スコープ
スコープは、 名前空間が直接アクセス可能なPythonプログラムのテキスト領域です。
スコープは、コード領域、名前空間が直接参照することができる領域です。
私は理解して:
形成された内部関数の名前空間(マッピング/ポインタ/パス/ハッシュ)を呼び出す関数のコードは、オブジェクトの名前に対応する外部関数名を取得するために定義されて内部に、使用されてもよいです。次いで、コード領域の外側のコードを直接使用することができる機能は、範囲の関数です。
⚠️外部スコープ関数は、時間に対応する代わりの呼び出し位置に対応する、位置の関数定義です。
⚠️:参考記事:https://www.linuxidc.com/Linux/2018-12/155918.htm
名前空間の検索順序:
ローカル:最初に検索、最も内側の層(最も内側)のようなローカルスコープの名前を含む関数/メソッド/クラス内部ローカルスコープ。
包囲:内側から外側に入れ子レベルの検索を、任意の非局所(非ローカル)非グローバル(非大域)囲むスコープ関数名を含みます。ネストされた2つのスコープ機能、ローカルスコープの内部機能、範囲は、範囲の内側の関数を囲む外側の関数です。
株式会社フリーは参加:最後から二番目のは、現在のモジュールのグローバルスコープの名前が含まれ、検索され;
内蔵-in :最後の検索、最外層は、内蔵のスコープの名前が含まれています。
4つのスコープでのオーダーのLEGB上記の名前を検索し、何の検索、PythonのNameErrorが例外をスローが存在しないとPythonの合わせ。
:名前空間と範囲を理解するためにアナロジーを使用し 、私たち国民生活(内蔵の同等スコープの4種類 - で、州(グローバル)、市(囲む)、郡(ローカル)、公務員名簿の名前空間に相当します) 、人々が投稿ものです記録。サービスで全国公務員 だけの人自身(私は気にしない他の省から国家レベルの人や人を)奉仕する人(国の人々が仕事に彼を呼び出すことができます)、地方公務員、市(囲む)、郡(ローカル)があります真実。我々は、(探しているようなリーダーシップの特定のタイプを探しているとき 、私は優先順位内側、郡内の郡のリーダーシップ名簿優先権の外観(ローカル)(だった場合、(アクセス名に)助けに警官は私が戦うとき)独自の名前空間は、名簿名簿を見つけられませんでした郡警察は市内(に行ってきました)見つけるにスコープを 見つけるためのスコープ名前空間)のレベル、発見していない国家レベルの検索場所を知っている、それは意志エラー。人々が助けにあなたを地方警察を見つけたい場合は、市や郡を見つけることだけではなく、独自の地方(他の地方は動作しません)を見つけるために、または国を見つけます。ナショナルは、 地方、市と郡は、あなたが移動することはできません、そこにされている必要があります(範囲は静的である);リーダーシップは、置換(名前空間が、新しい名前空間は、関数呼び出しになるたびに動的であると一般的な用語の移動することができ関数実行
違いグローカルと非ローカル
まず、2つの異なる機能。
キーグローバル変数を識別した後、変数を変更し、グローバル変数であり、変数は変更グローバル変数を変更し、そして非局所キーワードは、親が機能しない場合、変数は、ローカル変数の関数である変数を識別し修正されますローカル変数の存在、非局所位置誤差が発生します。
デフF1(): #I = 1 デフF2(): ローカル以外のI プリント(I) I = 2 F2() プリント(I) F1() #でSyntaxError:なしローカル以外のバインディング'I'が見つかり
第二に、二つの異なる範囲を使用します。
- グローバルキーワードはグローバルな変更は、直接使用することができた後、それは、以前に定義されていない場合でも、層の機能とネストされた関数最上含め、どこでも使用することができます。
- 非ローカルキーワードは、ネストされた関数で使用することができ、対応するローカル変数に定義された外層機能、またはエラーが発生します。
= I 0 DEF F1(): 私は = 1。 DEF F2(): グローバルI #が再バインド プリント(" グローバル" 、I)を 、私は 2 = F2() プリント(" ローカル" 、I) F1() #の出力を: #、(株)フリーは参加0 #ローカル1
いくつかの例:
I = 1 DEF F1(): プリント(I)DEF F2(): 私は = 2 F1() F2()プリント(I) #输出 #1 #1
説明:この例では、説明された機能の範囲外で、外部コード場合関数の定義。
IF Trueの場合: 私は、 1つの= 印刷(i)は#I 1は、与えられません通常の出力値を
説明:ステートメントは、新しいスコープを生成していない場合は、このショー、唯一の機能/クラスは、新しいスコープを生成します。
以下のために I におけるレンジ(10 ): 合格 印刷(I)#1 出力、9ないNameError
説明:無関係な範囲、私が宣言され、代入。
DEF 試験(): プリント(I) iは 2 = 私は = 0 (テスト)
説明:UnboundLocalError、エラーを報告します。ローカル変数は、「I」の割り当ての前に参照しました。私は占領されています。それは、もはや再文にすることはできません。
クラスA(オブジェクト): = 2 デフ楽しい(自己):プリント() new_class = A() new_class.fun() #NameError:名前''定義されていません
解説:理解していません。楽しい機能襟外部アクション、何らAはありません。