python中的模块更改问题

时间:2013-03-29 18:17:05

标签: 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

谁能告诉我可能是什么问题?

1 个答案:

答案 0 :(得分: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'