我正在阅读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文档中的错误还是我不明白?
答案 0 :(得分:12)
是的,这是文档错误。 import
语句将名称导入当前名称空间。通常import
在函数和类之外使用,但正如您所发现的,它在它们内部起作用。在您的示例函数中,在调用函数时,模块将导入到函数的本地名称空间中。 (你没有这样做,但无论如何都不能在功能之外使用它。)
global
关键字在此处有效,但是:
def foo():
global sys
import sys
foo()
sys.path
答案 1 :(得分:0)
我认为这不是文档中的错误,而是更多的错误解释。你只是有一个范围问题。您将在函数foo()的范围内导入它。您当然可以按照文档建议的那样进行操作,并将导入放在文件的底部或文件中的其他位置,它仍然具有与模块相同的全局范围。问题是“导入的模块名称放在导入模块的全局符号表中”,您导入的模块的范围包含在函数foo()中,而不是模块的全局级别。