python import和from import

import和from import都是将其他模块导入当前模块中。
刚开始一直以为import和from import唯一的区别,就是from import可以少写一些模块名。虽然from XX import 会污染当前名字空间,但似乎仅限如此。
但其实from import还有一个相当严重的陷阱。
举例来说:

#a.pytest = 2print 'in a'#b.pyfrom a import *print testtest = 3from c import *print test#c.pyfrom a import *print testtest = 4

结果为:

python b.pyin a224

如果将代码修改如下:

#a.pytest = 2print 'in a'#b.pyimport aprint a.testa.test = 3import cprint c.a.test#c.pyimport aprint a.testa.test = 4

结果为:

python b.pyin a234

如果,我们把a.py中的test = 2修改为 test = [2],后面对test的修改改为对test[0]的修改,则会发现,import和from import的结果完全一致。

通过以上的分析。基本可以得到这样的结论:
1 重复import或from import多次都只会作用一次
2 import和from import的作用机制完全不同
3 import的机制是将目标模块中的对象完整的引入当前模块,但并不引入新的变量名
4 from import的机制则是通过引入新的变量名的形式,将目标模块的对象的引用拷贝到新的变量名下的方式引入当前模块

这样描述可能有点抽象,根据上面的例子来说就是:
1 当使用import时,只存在一个名为a.test变量,且只有这一个,无论是在b模块,还是c模块中
2 当使用from import时,在b模块中,存在一个新的变量b.test,开始时,b.test = a.test(它们共同指向同一个对象),当发生赋值时,b.test指向了一个新的对象,但a.test仍指向原来的对象。
具体来说就是:
(1) 初始时,在a中存在a.test变量,它指向一个整数对象‘2’
(2) 在执行b.py时,from a import * 的执行,相当于引入了一个新的变量名b.test,b.test = a.test,这时,b.test和a.test都指向整数对象‘2’
(3) 之后的赋值操作(test = 3),使得b.test = 3,使得b.test指向了整数对象'3',而a.test仍指向整数对象'2'
(4) 继续执行from c import * 时,进入c.py,在c模块中,执行from a import *,将引入新的变量名c.test,c.test = a.test,它们都指向整数对象'2',之后的赋值操作(test = 4),使得c.test = 4,现在,c.test指向了整数对象'4',而a.test仍指向整数对象'2'
(5) 回到b.py,由于b.test已存在,因此,不引人新的变量,而是直接执行b.test = c.test,这时,b.test指向整数对象'4'
最终的结果,a.test指向'2',b.test指向'4',c.test指向'4'
3 当test变为list时,b.test[0]的修改,并没有引起b.test本身的变化,换言之,b.test和a.test仍指向同一个对象,只不过这个对象内部被修改了

总结:
1 from import很危险,如果不了解其作用机制,慎用
2 即便知道了机制,一样要慎用
(原时间2015-03-03)

(0)

相关推荐

  • 致Python初学者:3分钟带你搞懂Python模块、包的区别和使用

    https://m.toutiao.com/is/JE2DFHP/ 一.模块和包的定义 模块的定义:任何*.py 的文件都可以当作模块使用import 导入 包的定义:包含一个__init__.py和 ...

  • python的名词解释

    python的名词解释

  • Python学习手册(第4版).2

    先说坑,看懂为什么前面那么多没有运行出来吗? 这个是一段代码 原因很简单,这个代码是在缓存区呢,得Ctrl+S 平时是这样运行,其实代码直接从缓存区到右边得执行区.文本文件并不保存 重定向也正常~ 在 ...

  • 彻底搞懂Python 中的 import 与 from import

    对不少 Python 初学者来说,Python 导入其他模块的方式让他们很难理解.什么时候用import xxx?什么时候用from xxx import yyy?什么时候用from xxx.yyy ...

  • python import

    http://c.biancheng.net/view/2397.html 前面章节中,已经看到使用 import 导入模块的语法,但实际上 import 还有更多详细的用法,主要有以下两种: imp ...

  • python中import如何使用

    https://m.php.cn/article/471651.html相关免费学习推荐:python视频教程https://www.php.cn/course/list/30.html使用pytho ...

  • Python导入模块,Python import用法(超级详细)

    http://c.biancheng.net/view/2397.html 使用 Python 进行编程时,有些功能没必须自己实现,可以借助 Python 现有的标准库或者其他人提供的第三方库.比如说 ...

  • 初窥Python的import机制

    https://m.toutiao.com/is/JEaoVFc/ 本文适合有 Python 基础的小伙伴进阶学习 作者:pwwang 一.前言 本文基于开源项目: https://github.co ...

  • Python中一行和多行import模块问题

     更新时间:2018年04月01日 11:27:06   作者:Xiphap   我们通过本篇文章给大家分析了为什么Python不建议使用一行import所有模块的原因,有兴趣的朋友学习下. Pyth ...

  • (4条消息) python中import re

    一.什么是正则表达式? 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合, ...

  • 如何Import自定义的Python模块?

    CDA数据分析师 昨天 来源:Be_melting https://blog.csdn.net/lys_828/article/details/106176229 导读 实际工作中,经常要用的功能能不 ...

  • Bug总结:python语言中出现的import error错误的解决思路

    Bug总结:python语言中出现的import error错误的解决思路 解决问题 import error错误 解决方法 T1.查看是否存在该包,要么是python集成好的包,要么是自定义的包 T ...