1. 程式人生 > >Python中的reload函數

Python中的reload函數

強制運行 clas 取出 color str size 兩個 模塊 pri

Python中的import語句可以導入module文件,但是import語句只是第一次導入的時候會執行module文件中的代碼,然後就會把導入的模塊文件存入到內存,當再次導入的時候,Python是直接從內存裏面取出module文件,而不會執行module文件的內容了,而reload函數強制Python重新導入並執行module文件。

假設有module文件a.py:

def changer():
    print("First Version")

然後在可交互的控制臺執行如下代碼:

>>>import a
>>>a.changer()
"First Version
"

然後我們不退出可交互式控制臺,然後修改a.py:

def changer():
    pirnt("Second Version")

然後在到可交互的控制臺執行如下代碼:

>>>import a
>>>a.changer()         # 已經導入的module文件,直接從內存裏面取,不會執行
"First Version"


>>>from imp import reload   # 對於Python 3.X來說,reload不是內置函數,而是imp module的一個函數
>>>reload(a)
<module a form /home/chaochao/python/a.py> >>>a.changer() # 對module文件a.py的改動反映出來了 "Sencond Version"

註意事項

1 由於import導入的moudle文件,使用的時候需要使用module.attr的方式,而reload會強制運行module文件,那麽,會對使用import導入進來的module文件有影響,因為reload執行module文件後,module.attr的值會被覆蓋;

2 由於from導入的module文件,其本質是進行了一個賦值操作,即在當前文件中(即執行from語句的文件)進行attr = module.attr,那麽,reload函數對reload運行之前的from語句沒有影響,換句話說,當前文件(即執行from語句的文件)中的變量attr與module.attr引用的已經是兩個不同的變量了;

3 假設a.py自己import b.py,那麽reload(a)並不會reload(b),也就是說,reload不具有傳遞性

4 使用reload的前提,是reload的 模塊,之前已經使用import或者from導入成功了,否則,reload也無法生效

5 對於Python 2.X來說,reload是一個內置函數,而Python 3.X將reload函數移動到了imp模塊當中

Python中的reload函數