2016-04-07 7 views
9

Pythonの内部についての質問。 import abcを実行すると、Pythonはモジュールを新しい名前空間に読み込み、グローバル名前空間内の変数abcを新しい名前空間を指すようにバインドします。`abc import xyz`を実行していますが、モジュール` abc`はどこに行きますか?

私はfrom abc import xyzを実行する場合、それはいくつかの新しい名前空間にモジュール全体abcを読み取り、モジュールがに読み込まれた、この新しく作成された名前空間にxyzにバインドされている同じオブジェクトをグローバル名前空間内の変数xyzをバインドします。少なくともそれは私の理解です。

その後、abcが読み込まれた名前空間はどうなりますか? xyzがその名前空間内の他のオブジェクトにアクセスする可能性があるので、どこかで生きていると仮定しています。この "幽霊" abc名前空間に何とかアクセスできますか?

xyzfghabcで同じグローバル変数を変更した場合、唯一の存在になるように、また、私は、私は

from abc import xyz 
from abc import fgh 

を行うならば、一つだけ「ゴースト」abc名前空間があることを仮定していますそれの1つのコピー。あれは正しいですか?

+1

これは好奇心の外ですか?このようにモジュールに「秘密に」アクセスしようとする本当の理由はありません。モジュールオブジェクトにアクセスしたい場合は、それを普通にインポートするだけです。 – BrenBarn

+0

ちょうど好奇心の外に、どのように物事がボンネットの下で働くかを理解しようとしています。私は多くのデータ作業を行い、この作業のいくつかをRからPythonに移行することを考えています。 – mrip

答えて

6

モジュールオブジェクトはsys.modulesに格納されます。したがって、from abc import xyzを実行すると、sys.modules['abc']abcモジュールオブジェクトを提供します。

+0

ありがとう、これはまさに私が不思議に思っていたものです。 – mrip

+1

また、 'xyz'が' abc'に依存する場合、おそらくモジュールのグローバルへの参照を持ちます。たとえば、 'xyz'が関数であれば、' xyz .__ globals__'は 'abc .__ dict__'になり、' sys.modules'エントリを削除しても 'xyz'はそのアクセス権を失うことはありません(他の奇妙な効果)。 – user2357112

関連する問題