python: import ... 与 from ... import (深入理解本质)

以下内容摘自<<Python学习手册>>(第四版)

1. import和 from是赋值语句

  • import module1
    将module1整个模块对象复制给变量名module1
  • from module1 import a
    将module1中的变量名a赋值给当前模块中的同名对象a

需要注意的是,Python中的赋值语句,对于可变对象,是引用;对不可变对象,是赋值。

在module1中, a被定义为列表[1,2]

 from module1 import a   
 a[0] = 2   # 此时module.a变为 [2,2]
 a = 2   # module.a还是[2,2]

2. from语句的实质

from module import a,b

与以下语句等效

import module
a = module.a
b = module.b

注意:from的第一步也是普通的import语句,因此from总会把整个模块对象赋值给一个变量。

只加载模块的某一部分(如一个类,一个函数)是不可能的,因为from和import语句其实都是加载了整个模块,只是from多一个从导入模块赋值部分变量名到当前空间的操作。

因此,无论是使用import还是from, 此模块的顶层可执行代码都会被执行。
(使用if __name == 'main’避免被执行)

3. 导入只发生一次

对每个进程,相同的模块只会被导入一次。因此,模块文件的顶层代码只会被执行一次,可以凭借这种特性进行变量初始化。

(使用内置函数reload,将一个模块的代码导入后再次运行)

4. from语句的潜在陷阱

如果使用from语句,那些被复制的变量碰巧和当前空间已有的变量(可能是之前的from语句复制进来的)同名,之前的就会被覆盖。

建议

  • 简单模块使用import (避免重名)
  • 复杂模块使用from,用于明确列出想要使用的变量(简洁)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值