如果我们在mod1模块中有递归函数func1,并且使用这两个语句导入它:
import mod1
和
from mod1 import func1
基本上,我们将有两个链接指向单个对象:
id(func1) == id(mod1.func1)
然后,如果我们在mod1.py文件中更新func1代码,然后重新加载mod1,而不是函数(func1)本身:
imp.reload(mod1)
我们将有两个不同的对象:
id(func1) != id(mod1.func1)
但是,如果我们调用func1(*args),首先调用func1,但是下面所有的递归调用都调用mod1.func1
在Python中,这是一种理想的行为吗?
以下是代码示例:
MOD1.PY:
def func1(n):
print("n is: {}".format(n))
if n==0: return 1
return n*func1(n-1)
然后修改:
def func1(n):
# print("n is: {}".format(n))
if n==0: return 1
return n*func1(n-1)
这里是repl输出:
>>> from mod1 import func1
>>> func1(2)
n is: 2
n is: 1
n is: 0
2
>>> import mod1
>>> mod1.func1(2)
n is: 2
n is: 1
n is: 0
2
>>> id(func1)
4304551720
>>> id(mod1.func1)
4304551720
>>> ## ** Here mod1 code is updated: ** ##
>>> import imp
__main__:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
>>> imp.reload(mod1)
>>> id(mod1.func1)
4305274128
>>> id(func1)
4304551720
>>> mod1.func1(2)
2
>>> func1(2)
n is: 2
2
>>>
好像有点混乱。
在Python中,这是一种理想的行为吗?