6
私は最近、いくつかの異常な動作に遭遇しました。Python Import Starは隠し名前空間を作成していますか?
foo.py
a = 0
def bar():
print (a)
コンソール:
>>> import foo
>>> foo.bar()
0
>>> foo.a = 10
>>> foo.bar()
10
コンソール:
>>> from foo import *
>>> bar()
0
>>> a
0
>>> a = 10
>>> a
10
>>> bar()
0
私はimport *
が実際にa
の2つのコピーを作成していることを推測しています - グローバルでの1をアクセスできないfoo
モジュール内の名前空間と1つed。この動作は説明されているかどこに文書化されていますか?私は検索するものを見つけ出すのに困っている。
これは、import *
の顕著で予期せぬ結果のようですが、何らかの理由で私はこれまでにそれを見たことがありませんでした。
これは明確に定義された動作です。隠された名前空間はありません。各関数がモジュールのグローバルについての知識を持っているということだけです。現在のモジュールのグローバルは、インポートされたモジュールのグローバルには影響しません。 [*各モジュールには独自のプライベートシンボルテーブルがあり、モジュールに定義されているすべての関数によってグローバルシンボルテーブルとして使用されます。したがって、モジュールの作成者は、ユーザーのグローバル変数との偶発的な衝突を心配することなく、モジュール内のグローバル変数を使用できます。*](https://docs.python.org/3/tutorial/modules.html#more-on-モジュール) –
本質的に、Pythonでユーザ定義のグローバルというものはありません。真のグローバルを作成するための厄介なハックがあります。本質的には使用する必要はありませんが、 'a = 10'のように定義したものはほとんどのモジュールレベルです。 – user2357112
元の 'foo'からの' a'はその関数のクロージャの一部です – jonrsharpe