【转载】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 ...
随机推荐
- 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】
题目描述 蒟蒻Edt把这个问题交给了你 ---- 一个精通数据结构的大犇,由于是第一题,这个题没那么难.. edt 现在对于题目进行了如下的简化: 最开始的数组每个元素都是0 给出nnn,optopt ...
- 被动式pocscan扫描神器搭建
1.搭建环境: 操作系统为:ubuntu16.04 x64位系统,内核版本3.0.10以上 2.安装docker镜像 root@backlion-virtual-machine:/# apt-get ...
- 前端基础----jquery
一.jQuery是什么? <1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. <2>jQuery是继 ...
- SpringMVC 之 表单标签
本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...
- socket--粘包
参考博客:http://www.cnblogs.com/kex1n/p/6502002.html 一.粘包现象 在上一篇的socket传输大数据文章中,我们可以顺利的接发数据,似乎做的不错,可以接收了 ...
- Mac(Linux)上安装memcached步骤
Mac上安装memcached类似于在Linux平台上安装memcached. 主要需要做两块: 一.安装libevent库: 二.安装memcached; 一.安装libevent库 libeven ...
- 枚举工具类 EnumUtils
这是一个枚举工具类,有时候一个枚举自身为空,我们程序在调用他的方法时(如:name(),ordinal()),就会报空指针异常:下面写这个工具类就是为了来避免这些问题的,有些外部引用的没有贴出来,不过 ...
- Global Vectors forWord Representation
参考论文: GloVe: Global Vectors forWord Representation 参考博客:https://blog.csdn.net/coderTC/article/detail ...
- HDU 3977 斐波那契循环节
这类型的题目其实没什么意思..知道怎么做后,就有固定套路了..而且感觉这东西要出的很难的话,有这种方法解常数会比较大吧..所以一般最多套一些比较简单的直接可以暴力求循环节的题目了.. /** @Dat ...
- Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈
LINK 题意:树上NIM的模板题,给出一颗树,现有操作删去端点不为根节点的边,其另一端节点都将被移除,不能取者为败 思路:一看就是个NIM博弈题,只是搬到树上进行,树上DFS进行异或 记得#014D ...