其他答案表现出轻微的困惑,如何import
真的有效。
这个说法:
import foo
大致相当于这个语句:
foo = __import__('foo', globals(), locals(), [], -1)
也就是说,它在当前作用域中创建一个与请求的模块同名的变量,并将调用的结果赋给它__import__()
包含该模块名称和大量默认参数。
The __import__()
函数句柄在概念上转换字符串 ('foo'
) 到模块对象中。模块缓存在sys.modules
,这是第一位__import__()
看起来 - 如果 sys.modules 有一个条目'foo'
,就是这样__import__('foo')
会回来的,无论是什么。它确实不关心类型。您可以亲自看到这一点;尝试运行以下代码:
import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop
暂时抛开风格问题,在函数内使用 import 语句可以按照您想要的方式工作。如果该模块以前从未导入过,它将被导入并缓存在 sys.modules 中。然后它将模块分配给具有该名称的局部变量。确实如此不 不 不修改任何模块级状态。它does可能会修改某些全局状态(向 sys.modules 添加新条目)。
也就是说,我几乎从不使用import
在函数内部。如果导入模块会导致程序明显变慢——就像它在静态初始化中执行长时间计算,或者它只是一个巨大的模块——并且您的程序实际上很少需要该模块来完成任何事情,那么仅在内部进行导入是完全可以的使用它的函数。 (如果这令人反感,Guido 会跳进他的时间机器并更改 Python 以阻止我们这样做。)但作为一项规则,我和一般 Python 社区将所有 import 语句放在模块范围内的模块顶部。