2013-03-29 97 views
0

我是python的新手。下面是我的模塊python模塊更改問題

mymath.py

pi = 3.142 

def circle(radius): 
    return pi * radius * radius 

在終端,我運行方式如下:

>>import mymath 
>>mymath.pi 
>>3.142 

當我改變PI局部變量和重裝(MYMATH)和做進口mymath,我仍然得到mymath.pi的價值爲3.142。然而,mymath.circle(radius)的結果確實反映了結果的變化。

def circle(radius): 
    pi = 3 
    return pi * radius * radius 

>>import imp 
>>imp.reload(mymath) 
>>import mymath 
>>mymath.pi 
>>3.142 
>>circle(3) 
>>27 

誰能告訴我可能是什麼問題?

回答

2

從文檔爲imp.reload()

當一個模塊被重新加載,其字典(包含模塊的全局變量)被保留。名稱的重新定義將覆蓋舊的定義,所以這通常不是問題。如果新版本的模塊未定義舊版本定義的名稱,則舊定義將保留。

所以當你做imp.reload(mymath),即使pi不再存在在模塊的代碼全局名稱的舊的定義仍然是更新的模塊的一部分。

如果你真的想從頭開始,請使用以下方法:

import sys 
del sys.modules['mymath'] 
import mymath 

例如:

>>> import os 
>>> os.system("echo 'pi = 3.142' > mymath.py") 
0 
>>> import mymath 
>>> mymath.pi 
3.142 
>>> os.system("echo 'pass' > mymath.py") 
0 
>>> import sys 
>>> del sys.modules['mymath'] 
>>> import mymath 
>>> mymath.pi 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'pi' 
+0

我只是想了解爲什麼它不經過我作出改變,即使從全局範圍中刪除pi並將其定義爲局部變量。我看到圈子反映變化的結果。然而,mymath.pi並未反映這一變化。 因爲在新的代碼中,pi沒有被分配到3.142。但改爲3 – user1247412

+0

@ user1247412不確定我是否在重新加載之前從mymath.py中刪除了'pi = 3.142'行? –

+0

是的,我確實刪除了pi = 3.142 – user1247412