Python 中 import 與 from-import 的區(qū)別

起因

在學習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屬性, 其他的屬性都訪問不了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,639評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產品券,享受所有官網優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 3,726評論 2 27
  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經驗的J...
    燕京博士閱讀 7,806評論 1 118
  • 投射兒子健康快樂積極向上 投射老媽健康長壽 投射自己健康快樂,心想事成 投射我的家庭幸福美滿 投射所有的愿望一一顯...
    苦咖啡_0a98閱讀 343評論 3 3

友情鏈接更多精彩內容