先简单创建一个模块文件作为例子:
#module1.py
def printer(x):
print(x)
import 语句
>>> import module1
>>> module1.printer('Hello world!')
Hello world!
from 语句
因为from直接从一个文件中拷贝一个特定的名字到其它作用域,它允许我们在代码中直接使用拷贝的名字而不需要通过模块:
>>> from module1 import printer
>>> printer('Hello world!')
Hello world!
from的格式允许我们拷贝多个名字,中间用逗号隔开。这个和import有同样的效果,不过因为被导入的名字被拷贝进了from语句出现的作用域里,使用这样的变量名不需要打太多字——我们可以直接只用而不是通过模块导入。事实上,from并不会赋值模块本身的名字。
正如之前的细节,from语句只是import语句的扩展——它需要导入整个文件,进行三步操作,但是有额外的一步,就是复制出一个或多个名字(不是对象)。尽管加载了整个模块,但可以更直接的访问其中的名字。
from * 语句
在from语句中当我们使用*
而不是特定的名字,我们会得到被引用模块中的所有名字,和from一样,我们可以在代码中直接使用printer:
>>> from module1 import *
>>> printer('Hello world!')
Hello world!
Import只发生一次
当人们开始使用模块之后问的最多的问题之一就是“为什么我的Import不能正常工作,他们经常报告说第一次Import 运行的很好,但是之后在同一过程中的运行并不是很有效。下面就是原因:
模块会在第一次import 或者from时被加载和运行,并且仅这一次。这是有原因的——因为import是一个很昂贵的操作,Python默认每个文件每个进程只会运行一次,之后的引用操作只会去匹配已经加载的模块对象。
初始化代码
因为一个模块文件中的代码通常只会执行一次,你可以用它来初始化变量,例如:
#simple.py
print('hello')
spam = 1
在这个例子中,print和=在模块第一次被导入的时候被执行,变量spam是在导入时被初始化的:
% python
>>> import simple
hello
>>> simple.spam
1
第二次和之后的导入并不会重新运行模块的代码,它仅仅从Python内部的模块表匹配已经创立的模块对象。因此,变量spam不能被重新初始化:
>>> simple.spam = 2
>>> import simple
>>> simple.spam
2
当然,有时候你希望在后续的引用中重新运行模块代码,这就需要用到Python的reload
函数。
import和from是赋值
就像def,import和from是可执行的语句,不是编译声明。他们可以被嵌套在if结构中,在不同的操作中选择;出现在def里,只在被调用的时候加载;在try语句块里使用,提供默认选项;等等。当程序运行时,只有当Python到达它们的时候才会被运行。换句话说,只有当相关的import和from语句运行到的时候被引用的模块和名字才可用。