9

我正在阅读http://docs.python.org/2/tutorial/modules.html#more-on-modules并想知道以下内容是否正确:

模块可以导入其他模块。将所有导入语句放在模块(或脚本,就此而言)的开头是习惯但不是必需的。导入的模块名称放置在导入模块的全局符号表中。

显然不是:

>>> 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 回答