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