Python文档中的错误?

时间:2013-03-07 23:21:30

标签: python import module

我正在阅读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文档中的错误还是我不明白?

2 个答案:

答案 0 :(得分:12)

是的,这是文档错误。 import语句将名称导入当前名称空间。通常import在函数和类之外使用,但正如您所发现的,它在它们内部起作用。在您的示例函数中,在调用函数时,模块将导入到函数的本地名称空间中。 (你没有这样做,但无论如何都不能在功能之外使用它。)

global关键字在此处有效,但是:

def foo():
    global sys
    import sys

foo()
sys.path

答案 1 :(得分:0)

我认为这不是文档中的错误,而是更多的错误解释。你只是有一个范围问题。您将在函数foo()的范围内导入它。您当然可以按照文档建议的那样进行操作,并将导入放在文件的底部或文件中的其他位置,它仍然具有与模块相同的全局范围。问题是“导入的模块名称放在导入模块的全局符号表中”,您导入的模块的范围包含在函数foo()中,而不是模块的全局级别。