2017-09-07 12 views
8

モジュールは、実行のある時点で定義された名前など、そのコンテキストを追跡するための辞書を保持します。この辞書はmoduleがインポートされた場合vars(module)(又はmodule.__dict__)を介してアクセス、またはモジュール自体にlocals組み込み関数の呼び出しによってすることができる。地方辞書はいつ設定されますか?

更新と現在のローカルシンボルテーブルを表す辞書を返します。

しかし、地元の辞書に関数からアクセスしようとすると、ちょっと混乱しました。のみ、以下を含むスクリプトの出力は空の辞書です:

def list_locals(): 
    print(locals()) 

list_locals() 

しかし、スクリプトが排他的に以下が含まれている場合、一方で、出力は__name____doc__や他のモジュールを含む、予想された辞書ですレベル変数:

print(locals()) 

したがって、地域辞書の内容はいつ設定されますか? さらに、locals関数の定義で「更新」とは何ですか?

+0

モジュールレベルで 'print(locals()is globals())' –

+0

@Chris_Randsこれは私の混乱の一部でした。 –

答えて

7

モジュールの名前空間はglobals()でアクセスされるグローバル名前空間です。別のローカルネームスペースがないので、関数の外にあるlocals()は、グローバル名前空間を返します。

関数にはローカル名前空間があります。 locals()は、その名前空間の片方向の反映であることに注意してください。関数のCPythonの実装は高度に最適化されており、locals()辞書を使用してローカル変数を追加または変更することはできません。 locals()によって返された辞書は、その関数への呼び出しの間に名前空間が変更されるたびに更新されます。

list/dict/setの解説、ジェネレータの式、クラスの本体なども実際には関数として実行されますが、名前空間の規則は異なります。そのようなコンテキストでは、locals()は別個の関数ローカル名前空間も返します。

+1

いつものように、consiceとクリア、ありがとう! –

1

同じ関数呼び出し中にlocals()を複数回呼び出すと、同じ辞書が返されます。

>>> def f(): 
...  d = locals() 
...  assert 'd' not in d 
...  locals() 
...  assert 'd' in d 
...  assert d is locals() 
...  print(d) 
... 
>>> f() 
{'d': {...}} 

この場合の「更新」この辞書の内容が存在するローカル変数の現在のスコープを反映するように更新されていますが、この辞書への参照を保持場合は、その辞書がまだ使用されることを意味します。

ローカル辞書には、機能の進行中にローカル辞書にアクセスできたとしても、'f'のキーは含まれていません。それが明らかでない場合は、それはグローバルであり、ローカルではありません。

+0

"更新"の意味についての説明をありがとう。私は明らかに 'locals'と' globals'を混在させましたが、私はドキュメンテーションがその振る舞いについていくらか避けていると言います。明確化のためにもう一度おねがいします。 –

関連する問題