【发布时间】:2019-04-28 08:43:08
【问题描述】:
如果我们在模块 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)
<module 'mod1' from '/home/user/workspace/python/tests/mod1.py'>
>>> id(mod1.func1)
4305274128
>>> id(func1)
4304551720
>>> mod1.func1(2)
2
>>> func1(2)
n is: 2
2
>>>
这似乎有点令人困惑。 这是 python 中期望的行为吗?
【问题讨论】:
-
很有趣,但很难回答关于可取性的部分......
标签: python function object recursion python-module