在一個(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è)模塊。
來實(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
由于有緩存的存在,使得我們無法重新載入一個(gè)模塊。
但若你想反其道行之,可以借助 importlib 這個(gè)神奇的庫來實(shí)現(xiàn)。事實(shí)也確實(shí)有此場景,比如在代碼調(diào)試中,在發(fā)現(xiàn)代碼有異常并修改后,我們通常要重啟服務(wù)再次載入程序。這時(shí)候,若有了模塊重載,就無比方便了,修改完代碼后也無需服務(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文章
2837瀏覽量
53294 -
緩存
+關(guān)注
關(guān)注
1文章
248瀏覽量
27761 -
python
+關(guān)注
關(guān)注
57文章
4876瀏覽量
90054
發(fā)布評(píng)論請(qǐng)先 登錄
KeepAlive:組件緩存實(shí)現(xiàn)深度解析
IoT智能模塊高速緩存核心IS61WV204816ALL-12B
RDMA設(shè)計(jì)21:連接管理模塊設(shè)計(jì)
RDMA設(shè)計(jì)14:連接管理模塊設(shè)計(jì)
維視智造攜手寶雞文理學(xué)院 共建AI產(chǎn)學(xué)研新生態(tài) ——人工智能融創(chuàng)現(xiàn)代產(chǎn)學(xué)研學(xué)院揭牌儀式圓滿舉行
沒有專利的opencv-python 版本
一文理解模數(shù)轉(zhuǎn)換器中的有效位數(shù)
一文詳解xilinx 7系列FPGA配置技巧
緩存之美:萬文詳解 Caffeine 實(shí)現(xiàn)原理(上)
高性能緩存設(shè)計(jì):如何解決緩存偽共享問題
由 Mybatis 源碼暢談軟件設(shè)計(jì)(八):從根上理解 Mybatis 二級(jí)緩存
MCU緩存設(shè)計(jì)
Nginx緩存配置詳解
一文理解python模塊的緩存
評(píng)論