在一個模塊內(nèi)部重復(fù)引用另一個相同模塊,實(shí)際并不會導(dǎo)入兩次,原因是在使用關(guān)鍵字 import
導(dǎo)入模塊時,它會先檢索 sys.modules
里是否已經(jīng)載入這個模塊了,如果已經(jīng)載入,則不會再次導(dǎo)入,如果不存在,才會去檢索導(dǎo)入這個模塊。
來實(shí)驗(yàn)一下,在 my_mod02
這個模塊里,我 import 兩次 my_mod01
這個模塊,按邏輯每一次 import 會一次 my_mod01
里的代碼(即打印 in mod01
),但是驗(yàn)證結(jié)果是,只打印了一次。
$ cat my_mod01.py
print('in mod01')
$ cat my_mod02.py
import my_mod01
import my_mod01
$ python my_mod02.py
in mod01
該現(xiàn)象的解釋是:因?yàn)橛?sys.modules
的存在。
sys.modules
是一個字典(key:模塊名,value:模塊對象),它存放著在當(dāng)前 namespace 所有已經(jīng)導(dǎo)入的模塊對象。
# test_module.py
import sys
print(sys.modules.get('json', 'NotFound'))
import json
print(sys.modules.get('json', 'NotFound'))
運(yùn)行結(jié)果如下,可見在 導(dǎo)入后 json 模塊后,sys.modules
才有了 json 模塊的對象。
$ python test_module.py
NotFound
由于有緩存的存在,使得我們無法重新載入一個模塊。
但若你想反其道行之,可以借助 importlib 這個神奇的庫來實(shí)現(xiàn)。事實(shí)也確實(shí)有此場景,比如在代碼調(diào)試中,在發(fā)現(xiàn)代碼有異常并修改后,我們通常要重啟服務(wù)再次載入程序。這時候,若有了模塊重載,就無比方便了,修改完代碼后也無需服務(wù)的重啟,就能繼續(xù)調(diào)試。
還是以上面的例子來理解,my_mod02.py
改寫成如下
# my_mod02.py
import importlib
import my_mod01
importlib.reload(my_mod01)
與上面不同的是,這邊執(zhí)行了兩次 my_mod01.py
$ python3 my_mod02.py
in mod01
in mod01
審核編輯:湯梓紅
-
模塊
+關(guān)注
關(guān)注
7文章
2722瀏覽量
47597 -
緩存
+關(guān)注
關(guān)注
1文章
240瀏覽量
26707 -
python
+關(guān)注
關(guān)注
56文章
4800瀏覽量
84843
發(fā)布評論請先 登錄
相關(guān)推薦
評論