我是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
谁能告诉我可能是什么问题?
答案 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'