我在玩递归,结果是这样的:
n = 0
def func(f) :
print("setting p to 1") #NEW#
p = 1 #local var
global n
n+=1
print(n)
if n > 5 :
print("returning")
return
print("calling f(f) with id() of " + str(id(f)))
f(f)
print("incrementing p") #NEW#
p +=1
print("p = " + str(p))
print(str(id(func)))
func(func)
好吧,我的问题是,如果 f 始终是相同的 id(确实如此),因此始终是相同的对象(我敢打赌这就是我在某种程度上出错的地方),p 不应该是相同的 p 并因此递增超过 2 吗?相反,它将每个 p 视为不同对象的本地对象。
输出:
178374636
1
calling f(f) with id() of 178374636
2
calling f(f) with id() of 178374636
3
calling f(f) with id() of 178374636
4
calling f(f) with id() of 178374636
5
calling f(f) with id() of 178374636
6
returning
p = 2
p = 2
p = 2
p = 2
p = 2
带有新评论的新输出
178374572
setting p to 1
1
calling f(f) with id() of 178374572
setting p to 1
2
calling f(f) with id() of 178374572
setting p to 1
3
calling f(f) with id() of 178374572
setting p to 1
4
calling f(f) with id() of 178374572
setting p to 1
5
calling f(f) with id() of 178374572
setting p to 1
6
returning
incrementing p
p = 2
incrementing p
p = 2
incrementing p
p = 2
incrementing p
p = 2
incrementing p
p = 2
请您参考如下方法:
p 是一个局部变量,与 func 始终具有相同 id 的事实无关。每次调用 func 都会创建一个新的堆栈框架,其中包含新的局部变量实例
