他の答えは、実際にどのように機能するかについての穏やかな混乱を示しimport
ています。
この文:
import foo
次のステートメントとほぼ同等です。
foo = __import__('foo', globals(), locals(), [], -1)
つまり、現在のスコープに、要求されたモジュールと同じ名前の変数を作成し、__import__()
そのモジュール名と大量のデフォルト引数を使用して呼び出した結果を割り当てます。
__import__()
関数handlesは、概念的に文字列()をモジュールオブジェクトに変換します'foo'
。モジュールはにキャッシュされsys.modules
、それが最初に__import__()
見えます。sys.modulesにのエントリがある場合'foo'
、__import__('foo')
それが何であれ、それが返されます。それは本当にタイプを気にしません。これが実際に動作しているのを自分で見ることができます。次のコードを実行してみてください。
import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop
今のところ文体の懸念はさておき、関数内にimportステートメントを含めると、希望どおりに機能します。モジュールがこれまでにインポートされたことがない場合は、インポートされてsys.modulesにキャッシュされます。次に、モジュールをその名前のローカル変数に割り当てます。モジュールレベルの状態は変更されません。一部のグローバル状態を変更する可能性があります(sys.modulesに新しいエントリを追加します)。
そうは言っても、私は関数内で使用することはほとんどありませんimport
。モジュールをインポートすると、静的初期化で長い計算が実行される場合や、単に大規模なモジュールである場合など、プログラムに顕著な速度低下が発生し、プログラムが実際にモジュールを必要とすることはめったにない場合は、インポートを内部にのみ行うことはまったく問題ありません。それが使用される機能。(これが不快な場合、Guidoはタイムマシンにジャンプし、Pythonを変更して、それができないようにします。)しかし、原則として、私と一般的なPythonコミュニティは、すべてのインポートステートメントをモジュールスコープのモジュールの先頭に配置します。