Python 中 import 与 from-import 的区别

起因

在学习Python的过程中好奇import xxx 与 from xxx

寻找问题

动手写了两个Pythonx程序a.py与b.py
这是a.py

#a.py
def foo():
    print 'this is a.foo'
print 'this is a.py'

然后在b.py中我先这样写的

#b.py
import a
def foo():
    print 'this is b.foo'
print 'this is b.py'
foo()

运行b.py 输出的结果为
<pre>
this is a.py
this is b.py
this is b.foo
</pre>
修改b.py为from a import *

from a import *
def foo():
    print 'this is b.foo'
print 'this is b.py'
foo()

运行b.py 输出的结果仍然
<pre>
this is a.py
this is b.py
this is b.foo
</pre>
感觉不可能这么没有道理, 没有任何区别
但是当在b.py调用a.foo()时, 就出现问题了

from a import *
def foo():
    print 'this is b.foo'
print 'this is b.py'
a.foo()

<pre>
this is a.py
this is b.py
Traceback (most recent call last):
File "b.py", line 5, in <module>
a.foo()
NameError: name 'a' is not defined
</pre>
报错结果为a并没有被定义, 这样一下就豁然开朗了
其实这是一个名称空间与变量作用域的问题(名称空间是名称到对象的映射,Python在程序执行期间会有两个或三个活动的名称空间.分别是巨擘名称空间,全局名称空间和内建名称空间, 当然这一说就多了, 这里就不细说了)

结论

<pre>
import a
from a import *
</pre>

相同点

两种导入方式中都会对a.py进行加载并执行

不同点

a.py中属性的作用域不同
import a

调用a.py中的foo函数
<pre>a.foo()</pre>
foo属于名称空间a

from a import *

调用a.py中的foo函数
<pre>foo()</pre>
foo就属于当前作用域, 访问foo函数不需要加入a名称

拓展

以下两种方式
<pre>
from a import *
from a import foo
</pre>
对于第二种方式, a.py在导入时仍然会被加载并执行, 不同的是在b.py中只能调用a中的foo属性, 其他的属性都访问不了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 3,672评论 2 27
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,638评论 1 118
  • 投射儿子健康快乐积极向上 投射老妈健康长寿 投射自己健康快乐,心想事成 投射我的家庭幸福美满 投射所有的愿望一一显...
    苦咖啡_0a98阅读 317评论 1 3