起因
在学习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属性, 其他的属性都访问不了
网友评论