除了包含函数定义外,模块也可以包含可执行语句。这些语句一般用来初始化模块。它们仅在 第一次 被导入的地方执行一次。
每个模块都有自己私有的符号表,被模块内所有的函数定义作为全局符号表使用。因此,模块的作者可以在模块内部使用全局变量,而无需担心它与某个用户的全局变量意外冲突。从另一个方面讲,如果你确切的知道自己在做什么,你可以使用引用模块函数的表示法访问模块的全局变量,modname.itemname
。
模块可以导入其他的模块。一个(好的)习惯是将所有的 import 语句放在模块的开始(或者是脚本),这并非强制。被导入的模块名会放入当前模块的全局符号表中。
import 语句的一个变体直接从被导入的模块中导入命名到本模块的语义表中。例如:
>>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这样不会从局域语义表中导入模块名(如上所示,fibo
没有定义)。
甚至有种方式可以导入模块中的所有定义:
>>> from fibo import * >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这样可以导入所有除了以下划线( _
)开头的命名。
需要注意的是在实践中往往不鼓励从一个模块或包中使用 *
导入所有,因为这样会让代码变得很难读。不过,在交互式会话中这样用很方便省力。
Note
出于性能考虑,每个模块在每个解释器会话中只导入一遍。因此,如果你修改了你的模块,需要重启解释器或者如果你就是想交互式的测试这么一个模块,可以用 reload() 重新加载,例如 reload(modulename)
。