有人可以解释为什么执行以下代码:
文件“ hello.py ”:
import hello
print "hello"
hello = reload(hello)
执行为python hello.py
打印以下内容?
hello
hello
hello
hello
为什么是4次?我知道当一个模块已经被导入时,它不会再次被导入,但是即使它已经被加载,重新加载也会强制重新加载一个模块。我本来期望结果是无限的“你好”打印。
必须发生什么才reload
不会重新加载模块?
有人可以解释为什么执行以下代码:
文件“ hello.py ”:
import hello
print "hello"
hello = reload(hello)
执行为python hello.py
打印以下内容?
hello
hello
hello
hello
为什么是4次?我知道当一个模块已经被导入时,它不会再次被导入,但是即使它已经被加载,重新加载也会强制重新加载一个模块。我本来期望结果是无限的“你好”打印。
必须发生什么才reload
不会重新加载模块?
python hello.py
(A) 运行代码一次,当 (A) 调用时import hello
,代码再次运行 (B),当 (A) 和 (B) 调用reload(hello)
时,代码再运行两次,总共运行四次。
通常,在程序的生命周期中,模块的代码将在以下时间执行:
reload()
在模块上调用任何时间至于为什么reload()
不递归调用,有一个提前退出点指向 PyImport_ReloadModule() 函数(CPython,文件是 import.c)来防止这种情况:
http://svn.python.org/view/python/trunk/Python/import.c?view=markup#l2646
...
existing_m = PyDict_GetItemString(modules_reloading, name);
if (existing_m != NULL) {
/* Due to a recursive reload, this module is already
being reloaded. */
Py_INCREF(existing_m);
return existing_m;
}
... load module code is below here
reload
保留当前正在重新加载的模块的列表(实际上是一个字典),以避免递归地重新加载模块。
见http://hg.python.org/cpython/file/e6b8202443b6/Lib/imp.py#l236
因此,这没有记录在案,但我认为您可能可以依靠它保持这种情况。