【转载】python import和from import
import和from import都是将其他模块导入当前模块中。
刚开始一直以为import和from import唯一的区别,就是from import可以少写一些模块名。虽然from XX import 会污染当前名字空间,但似乎仅限如此。
但其实from import还有一个相当严重的陷阱。
举例来说:
#a.py
test = 2
print 'in a'
#b.py
from a import *
print test
test = 3
from c import *
print test
#c.py
from a import *
print test
test = 4
结果为:
python b.py
in a
2
2
4
如果将代码修改如下:
#a.py
test = 2
print 'in a'
#b.py
import a
print a.test
a.test = 3
import c
print c.a.test
#c.py
import a
print a.test
a.test = 4
结果为:
python b.py
in a
2
3
4
如果,我们把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 即便知道了机制,一样要慎用
作者:littlersmall
链接:http://www.jianshu.com/p/c82429550dca
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【转载】python import和from import的更多相关文章
- python学习--Python之import与from...import的区别与用法
Python编码第一步是导入模块,有时候用import ***有时候用from...import,它们有什么区别呢,请看实例A/B: A: 1.当模块test.py中没有类,只有方法add,此方法实现 ...
- python中import和from...import区别
在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...
- python中import和from...import...的区别
python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...
- python的import与from...import的不同之处
在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...
- Python import与from import使用及区别介绍
Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.接下来通过本文给大家介绍Python import与from import使用及区别介绍,感 ...
- python笔记-1(import导入、time/datetime/random/os/sys模块)
python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...
- python笔记-6(import导入、time/datetime/random/os/sys模块)
一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其它内容待日后有深入理解了再来细说 1.import可以导入的两种不同的内容 1.1 *.py文件结尾的文件 ...
- Python中import和from import
Python里面的import和from import都是用于导入一个模块,两者的区别是 如果你在使用某模块内函数时不想写模块名,那么就用from import方式导入,如果是用import方式就要写 ...
- python之from 和import执行过程分析
原文链接:http://blog.csdn.net/lis_12/article/details/52883729 问题1 同一个目录下,有两个Python文件,A.py,B.py #A.py fro ...
随机推荐
- atom插件安装引发的nodejs和npm安装血案
最近在写前端网页,学习就要从高大上的地方开始,于是我打算装一个atom编辑器. 本来就是由github客户端的,再装个atom也算是配套了吧,其实本白也是蛮费心思的,技术不怎么地,什么神器都再努力地使 ...
- 2017中国大学生程序设计竞赛 - 女生专场 1002 dp
Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- String的indexOf方法
indexOf(String.indexOf 方法)字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个 ...
- 使用jconsole工具来监控java运行情况
参考:http://blog.163.com/lucas_nina/blog/static/185960149201493034258448/ 经验证OK jconsole是jdk自带的工具. ...
- Maven仓库--Nexus的配置使用
一.Nexus的作用 指定私服的中央地址.将自己的Maven项目指定到私服地址.从私服下载中央库的项目索引.从私服仓库下载依赖组件.将第三方项目jar上传到私服供其他项目组使用. 二.Nexus仓库 ...
- Nexus(Maven仓库私服)安装
一.Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven ...
- ThinkPHP+Memcache的缓存方案总结
简介: ThinkPHP用S()方法可以缓存数据,这在访问数据库时非常有用,可以在有限时间内当数据库无变化时从缓存取数据,有变化时从数据库取数据. Memcached+Memcache是一个将数据保存 ...
- Python学习笔记(二十五)操作文件和目录
摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319253241 ...
- 不平衡分类学习方法 --Imbalaced_learn
最近在进行一个产品推荐课题时,由于产品的特性导致正负样本严重失衡,远远大于3:1的比例(个人认为3:1是建模时正负样本的一个临界点),这样的样本不适合直接用来建模,例如正负样本的比例达到了50:1,就 ...
- jQuery UI基本使用方法
其实jQuery UI早就在我的学习计划中,只不过因为计划安排始终处于待命状态,最近项目要用到jQuery UI,就提前学习一下,也想能够封装自己的UI库,这样就不用老按照别人的套路走了,像使用jQu ...