给导入的模块起别名

导入模块之后, 可能模块名比较长, 想换个短点的, 我们可以给导入的模块起个别名.

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)

说明:

  1. 通过from语句导入的时候, 并不会创建新的命名空间, 而是把导入的定义放在了当前命名空间中, 所以使用的时候不需要添加命名空间.

  2. 这种写法是错误的:fibo.fib(20), 因为根本就不存在fibo这个命名空间

  3. 可以一次导入多个定义:from fibo import fib, a, b, c

  4. 使用通配符导入一个模块中所有的定义: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 之后是这样的:

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""