2013-03-07 40 views
9

我讀http://docs.python.org/2/tutorial/modules.html#more-on-modules,不知是否以下是正確的:Python文檔中的錯誤?

模塊可以導入其它模塊。通常,但不要求 將所有導入語句放在模塊的開頭(或腳本, 就此而言)。 導入的模塊名稱被放置在導入模塊的全局符號表的 中。

顯然並非如此:

>>> 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的文檔中的錯誤還是我不明白的東西?

+2

你可以在http://bugs.python.org上報告。 – 2013-03-07 23:45:54

+0

@AshwiniChaudhary完成:http://bugs.python.org/issue17383 – piokuc 2013-03-07 23:56:53

回答

12

是的,這是一個文檔錯誤。 import語句將名稱導入當前的命名空間。通常在函數和類之外使用import,但正如您發現的那樣,它在其中起作用。在你的示例函數中,當函數被調用時,模塊被導入到函數的本地名字空間中。 (你沒有這樣做,但不會使其可用的功能外反正。)

global關鍵字不但是在這裏工作,:

def foo(): 
    global sys 
    import sys 

foo() 
sys.path 
0

我不認爲這實際上是文檔中的錯誤,但更多的是誤解。你只是有一個範圍問題。您將它導入到函數foo()的範圍中。你當然可以按照文檔建議的那樣做,並將導入放在文件的底部或文件的其他地方,這些文件仍然會與模塊具有相同的全局範圍。問題是「導入的模塊名稱被放置在導入模塊的全局符號表中」,其中您導入的模塊範圍包含在函數foo()中,而不是模塊的全局級別。