给导入的模块起别名
导入模块之后, 可能模块名比较长, 想换个短点的, 我们可以给导入的模块起个别名.
import hello_world as hw
hw.foo()
注意:
起别命名之后只会创建hw
命名空间, 而不会再创建hello_world
命名空间. 所以这样使用是错误的:hello_world.foo()
一次导入多个模块
前面我们已经了解到使用import
可以导入一个模块.
我们也可以多次使用import
来导入多个模块
import a
import b
import c
上面这种写法比较啰嗦, 可以使用一个import
同时导入多个模块
import a, b, c
从模块导入具体的定义(from
方式导入)
单独使用import
是导入整个模块, 默认的所有定义都会导入, 而且会创建新的命名空间. 并且模块的代码也会执行.
如果我们仅仅是用到模块中某个函数或者类, 这个时候, 我们可以只导入我们想要的某个定义, 而不需要导入整个模块.
语法:
from 模块 import 具体的定义
from fibo import fib # 从模块 fibo 中只导入 fib
fib(20)
说明:
通过
from
语句导入的时候, 并不会创建新的命名空间, 而是把导入的定义放在了当前命名空间中, 所以使用的时候不需要添加命名空间.这种写法是错误的:
fibo.fib(20)
, 因为根本就不存在fibo
这个命名空间可以一次导入多个定义:
from fibo import fib, a, b, c
使用通配符导入一个模块中所有的定义:
from fibo import *
from
导入的作用域问题
把一个函数从一个模块导入当前模块时, 并不会改变这个函数的作用域规则. 也就是说函数的全局命名空间仍然是那个函数定义所在的命名空间.
a.py:
n = 30
def foo():
print("a模块: n的值" + str(n))
b.py:
from a import foo, n
n = 1000
foo()
print("当前模块: n 的值:" + str(n))
原因分析:
foo
函数中的n
, 仍然是a
模块中的n
为什么呢?
在 python 中任何数据都是变量, n
仅仅是对象的一个引用(符号). 导入 n
到当前模块, 仅仅是在原来的对象上多了一个引用而已.
这个两个n
由于命名空间不同, 所以不是同一个n
. 修改一个变量的值, 其实是让这个变量指向了一个新的对象
导入成功from a import foo, n
之后是这样的:
在 b 模块中修改 n 的值n = 1000
之后是这样的: