Python 中 import 与 from-import 的区

2016-09-20  本文已影响525人  百分之百的大风

起因

在学习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属性, 其他的属性都访问不了

上一篇下一篇

猜你喜欢

热点阅读