6.1. 有关模块的更多信息
模块可以包含可执行的语句以及函数定义。这些语句用于初始化模块。它们仅在模块 第一次 在 import 语句中被导入时才执行。 1 (当文件被当作脚本运行时,它们也会执行。)
每个模块都有它自己的私有符号表,该表用作模块中定义的所有函数的全局符号表。因此,模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突。另一方面,如果你知道自己在做什么,则可以用跟访问模块内的函数的同样标记方法,去访问一个模块的全局变量,modname.itemname
。
模块可以导入其它模块。习惯上但不要求把所有 import
语句放在模块(或脚本)的开头。被导入的模块名存放在调入模块的全局符号表中。
import
语句有一个变体,它可以把名字从一个被调模块内直接导入到现模块的符号表里。例如:
>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这并不会把被调模块名引入到局部变量表里(因此在这个例子里,fibo
是未被定义的)。
还有一个变体甚至可以导入模块内定义的所有名称:
>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这会调入所有非以下划线(_
)开头的名称。 在多数情况下,Python程序员都不会使用这个功能,因为它在解释器中引入了一组未知的名称,而它们很可能会覆盖一些你已经定义过的东西。
注意通常情况下从一个模块或者包内调入 *
的做法是不太被接受的, 因为这通常会导致代码的可读性很差。不过,在交互式编译器中为了节省打字可以这么用。
如果模块名称之后带有 as
,则跟在 as
之后的名称将直接绑定到所导入的模块。
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这会和 import fibo
方式一样有效地调入模块, 唯一的区别是它以 fib
的名称存在的。
这种方式也可以在用到 from
的时候使用,并会有类似的效果:
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
注解
出于效率的考虑,每个模块在每个解释器会话中只被导入一次。因此,如果你更改了你的模块,则必须重新启动解释器, 或者,如果它只是一个要交互式地测试的模块,请使用 importlib.reload()
,例如 import importlib; importlib.reload(modulename)
。