在一個(gè)模塊內(nèi)部重復(fù)引用另一個(gè)相同模塊,實(shí)際并不會(huì)導(dǎo)入兩次,原因是在使用關(guān)鍵字 import
導(dǎo)入模塊時(shí),它會(huì)先檢索 sys.modules
里是否已經(jīng)載入這個(gè)模塊了,如果已經(jīng)載入,則不會(huì)再次導(dǎo)入,如果不存在,才會(huì)去檢索導(dǎo)入這個(gè)模塊。
來(lái)實(shí)驗(yàn)一下,在 my_mod02
這個(gè)模塊里,我 import 兩次 my_mod01
這個(gè)模塊,按邏輯每一次 import 會(huì)一次 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
是一個(gè)字典(key:模塊名,value:模塊對(duì)象),它存放著在當(dāng)前 namespace 所有已經(jīng)導(dǎo)入的模塊對(duì)象。
# 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 模塊的對(duì)象。
$ python test_module.py
NotFound
由于有緩存的存在,使得我們無(wú)法重新載入一個(gè)模塊。
但若你想反其道行之,可以借助 importlib 這個(gè)神奇的庫(kù)來(lái)實(shí)現(xiàn)。事實(shí)也確實(shí)有此場(chǎng)景,比如在代碼調(diào)試中,在發(fā)現(xiàn)代碼有異常并修改后,我們通常要重啟服務(wù)再次載入程序。這時(shí)候,若有了模塊重載,就無(wú)比方便了,修改完代碼后也無(wú)需服務(wù)的重啟,就能繼續(xù)調(diào)試。
還是以上面的例子來(lái)理解,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文章
2788瀏覽量
50407 -
緩存
+關(guān)注
關(guān)注
1文章
246瀏覽量
27182 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86766
發(fā)布評(píng)論請(qǐng)先 登錄
高性能緩存設(shè)計(jì):如何解決緩存偽共享問題

MCU緩存設(shè)計(jì)
Nginx緩存配置詳解

nginx中強(qiáng)緩存和協(xié)商緩存介紹
運(yùn)行OVModelForCausalLM Python模塊時(shí)出錯(cuò)了,怎么解決?
HTTP緩存頭的使用 本地緩存與遠(yuǎn)程緩存的區(qū)別
什么是緩存(Cache)及其作用
一文理解多模態(tài)大語(yǔ)言模型——下

一文理解多模態(tài)大語(yǔ)言模型——上

緩存之美——如何選擇合適的本地緩存?

Python編程:處理網(wǎng)絡(luò)請(qǐng)求的代理技術(shù)
一文理解2.5D和3D封裝技術(shù)

一文理解布隆過(guò)濾器和布谷鳥過(guò)濾器

評(píng)論