9

http://docs.python.org/2/tutorial/modules.html#more-on-modulesを読んでいて、以下が正しいかどうか疑問に思います:

モジュールは他のモジュールをインポートできます。すべての import ステートメントをモジュール (またはスクリプト) の先頭に配置するのは慣例ですが、必須ではありません。インポートされたモジュール名は、インポート モジュールのグローバル シンボル テーブルに配置されます。

どうやらそうではありません:

>>> def foo(): import sys
... 
>>> foo()
>>> sys.path
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined

オンライン デモについては、http://ideone.com/cLK09vを参照してください。

それで、それはPythonのドキュメントのバグですか、それとも私は何かを理解していませんか?

4

2 に答える 2

12

はい、これは文書の誤りです。このimportステートメントは、名前を現在のネームスペースにインポートします。通常import、関数やクラスの外で使用されますが、おわかりのように、それらの中で機能します。関数の例では、関数が呼び出されると、モジュールは関数のローカル名前空間にインポートされます。(あなたはしませんでしたが、とにかく関数の外で利用できるようにはなりません。)

ただし、globalキーワードはここで機能します。

def foo():
    global sys
    import sys

foo()
sys.path
于 2013-03-07T23:25:32.057 に答える
0

これは実際にはドキュメントのエラーではないと思いますが、誤解です。スコープの問題があるだけです。関数 foo() のスコープでインポートしています。ドキュメントが示唆するように、インポートをファイルの下部またはモジュールと同じグローバルスコープを持つファイル内の別の場所に置くことができます。問題は、「インポートされたモジュール名がインポート モジュールのグローバル シンボル テーブルに配置される」ことです。インポート先のモジュールのスコープは、モジュールのグローバル レベルではなく、関数 foo() に含まれています。

于 2013-03-07T23:40:01.520 に答える