起因
在學習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>
感覺不可能這么沒有道理, 沒有任何區(qū)別
但是當在b.py調用a.foo()時, 就出現(xiàn)問題了
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在程序執(zhí)行期間會有兩個或三個活動的名稱空間.分別是巨擘名稱空間,全局名稱空間和內建名稱空間, 當然這一說就多了, 這里就不細說了)
結論
<pre>
import a
from a import *
</pre>
相同點
兩種導入方式中都會對a.py進行加載并執(zhí)行
不同點
a.py中屬性的作用域不同
import a
調用a.py中的foo函數(shù)
<pre>a.foo()</pre>
foo屬于名稱空間a
from a import *
調用a.py中的foo函數(shù)
<pre>foo()</pre>
foo就屬于當前作用域, 訪問foo函數(shù)不需要加入a名稱
拓展
以下兩種方式
<pre>
from a import *
from a import foo
</pre>
對于第二種方式, a.py在導入時仍然會被加載并執(zhí)行, 不同的是在b.py中只能調用a中的foo屬性, 其他的屬性都訪問不了