pythonの名前空間は本当に分かりますか?


前に書く
名前空間、namesapceというのは多くのプログラミング言語に出てくる用語です。多くの人がこの言葉を知っていると思いますが、本当にこれは何ですか?
グローバル変数&ローカル変数
グローバル変数とローカル変数は、名前空間を理解するためのスタートです。コードの一部を先に見てみます。

x = 2
def func():
  x = 3
  print('func x ---> ',x)

func()
print('out of func x ---> ',x)
このコードの出力の結果は以下の通りです。
func x-->3
out of func x-->2
上記の結果から、func()を実行し、func()の中の変数xが参照するオブジェクト3を出力し、その後実行するのがコードの最後の行となります。ここでは、前のxが関数内部の変数xを出力し、後のxが関数外の変数xを出力し、2つの変数が互いに影響を与えず、それぞれの作用領域で作用することを区別します。
それが関数内でしか機能しない変数を「局所変数」と呼び、「局部」があればそれに応じた「全部」がありますが、後者は意味が違って聞こえますので、「大局」と呼びます。

x = 2
def func():
  global x = 3 #    
  print('func x ---> ',x)

func()
print('out of func x ---> ',x)
このコードには前のコードよりglobal xが追加されています。これは声明xでグローバル変数という意味です。分かりやすく言えば、このxと関数外のxは同じです。結果は次のようになりました。
func x-->3
out of func x-->3
このように一见大域変数が强くて、関数の内外を管理することができますが、全体変数は慎重に使ったほうがいいです。外部と外部の违いがありますので、混乱を招かないように注意します。
スコープ
スコープは、比較的に直接的に言えば、プログラム中の変数と対象の存在が関連しているプログラムです。例えば、上で述べたように、x=2とx=3は二つの異なるスコープの中にあります。
一般的に、作用域は静的作用域と動的作用域に分けられています。Pythonは動的言語と言いますが、その作用域は静的作用域に属しています。すなわちPythonの変数の作用域は、その変数が存在するプログラムの位置によって決定されます。
Pythonにおいて、役割領域は、それぞれ、local(局所作用領域)、enclosing(ネスト作用領域)、global(大域作用領域)、及びbuilt-in(内部作用領域)の4つの階層に分割される。一つの変数については、Pythonも前の4つの階層に従って、使わない作用領域の中を逐次検索します。私たちは前のコードの中で、変数xに対して、まず検索したのは関数の体内の局所作用領域で、そして関数の体外の大域作用領域です。

def out_func():
  x = 2
  def in_func():
    x = 3
    print('in_func x ---> ',x)
  in_func()
  print('out_func x ---> ',x)

x = 4
out_func()
print('x == ',x)
上のコードと実行結果をよく観察してみると、変数が異なる範囲で検索する規則が発見されます。これらは以前に無視されたものだと思いますか?
名前空間
「Wikipedia」では「名前空間は作用領域に対する特殊な抽象的なもの」と言っていますが、ここでは比較的具体的に説明します。
例えば、張三さんは会社Aにいます。彼の仕事番号は111です。李四さんは会社Bにいます。彼の仕事番号も111です。二人は違う会社にいますから、同じでいいです。でも、混乱を起こさないようにします。ここの会社は独立した名前空間を表しています。工番だけ見ても、誰なのか分かりません。
実は上に挙げたこの例の特徴は、名前空間を使用する理由であり、大型のコンピュータプログラムでは、しばしば100以上の識別子が出現し、名前空間は隠し領域識別子を提供する仕組みがある。論理的に関連する識別子を応答の名前空間を構成することにより、システム全体をよりモジュール化することができる。
冒頭で引用した「ウィキペディア」の話では、「名前空間は機能領域に対する特殊な抽象的なものである」というが、これは実際にそのスコープ内にある識別子を含んでいて、その自身も識別子で表しています。Pythonでは、名前空間自体の識別子も、より外側の名前空間に属するので、名前空間も入れ子可能であり、それらは共に「グローバル名前空間」に住んでいる。
簡単に言えば、異なる名前空間は同時に存在することができますが、互いに独立し、互いに干渉しません。もちろん、名前空間は相手によって違います。以下の種類に分けられます。
1.ローカル名前空間:モジュールに関数またはクラスがある場合、それぞれの関数またはクラスによって定義された名前空間は、ローカル名前空間であり、関数が結果を返したり、例外を投げたりすると、ローカル名前空間は終了します。
2.グローバル名前空間:各モジュールは自分の持っているグローバル名前空間を作成し、異なるモジュールのグローバル名前空間は互いに独立し、異なるモジュールの中の同じ名前の名前空間もモジュールの違いで互いに干渉しない。
3.名前空間を内蔵しています。Pythonが起動すると、それらが存在します。内蔵関数の名前空間は名前空間に属しています。だから、どのプログラムでも直接実行できます。
プログラムが名前空間を検索する時も順序があります。順次に現地の名前空間に従って、グローバル名前空間に名前空間を内蔵します。

def fun(like):
  name = 'rocky'
  print(locals())

fun('python')
ローカルの名前空間にアクセスしてlocasを使って完成しました。結果を見てみます。
{'name':'rocky'、'like':'python'
上記の結果から、名前空間のデータ記憶の構造は辞書と同じであることが分かります。私たちがグローバルの名前空間に訪問する時には、globalsを使うことができます。
名前空間にはライフサイクルの問題があります。名前空間はいつ現れますか?いつ消えますか?これはよく分かります。どの部分がメモリに読み込まれますか?
後に書く
これで、私のゼロ基礎学習Python計画の中で関数の部分については終わりました。この部分の書く時間は私の元々の計画を超えています。でも、書いているうちに、少し知識があって、話したほうがいいと思います。来週から、「類」の部分の勉強を始めます。私達はまだこのまま歩いていけばいいです。
頑張りがあります。いいね。
以上がpythonの中の名前空間です。本当に知っていますか?の詳細については、python名前空間に関する資料を追加しますので、他の関連記事に注目してください。