起因
在學(xué)習(xí)Python的過程中好奇import xxx 與 from xxx
尋找問題
動(dòng)手寫了兩個(gè)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()
運(yùn)行b.py 輸出的結(jié)果為
<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()
運(yùn)行b.py 輸出的結(jié)果仍然為
<pre>
this is a.py
this is b.py
this is b.foo
</pre>
感覺不可能這么沒有道理, 沒有任何區(qū)別
但是當(dāng)在b.py調(diào)用a.foo()時(shí), 就出現(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>
報(bào)錯(cuò)結(jié)果為a并沒有被定義, 這樣一下就豁然開朗了
其實(shí)這是一個(gè)名稱空間與變量作用域的問題(名稱空間是名稱到對(duì)象的映射,Python在程序執(zhí)行期間會(huì)有兩個(gè)或三個(gè)活動(dòng)的名稱空間.分別是巨擘名稱空間,全局名稱空間和內(nèi)建名稱空間, 當(dāng)然這一說就多了, 這里就不細(xì)說了)
結(jié)論
<pre>
import a
from a import *
</pre>
相同點(diǎn)
兩種導(dǎo)入方式中都會(huì)對(duì)a.py進(jìn)行加載并執(zhí)行
不同點(diǎn)
a.py中屬性的作用域不同
import a
調(diào)用a.py中的foo函數(shù)
<pre>a.foo()</pre>
foo屬于名稱空間a
from a import *
調(diào)用a.py中的foo函數(shù)
<pre>foo()</pre>
foo就屬于當(dāng)前作用域, 訪問foo函數(shù)不需要加入a名稱
拓展
以下兩種方式
<pre>
from a import *
from a import foo
</pre>
對(duì)于第二種方式, a.py在導(dǎo)入時(shí)仍然會(huì)被加載并執(zhí)行, 不同的是在b.py中只能調(diào)用a中的foo屬性, 其他的屬性都訪問不了