Python递归中的全局变量结果不同
我有这段代码,它会打印出 1
:
s = 0
def dfs(n):
global s
if n > 10:
return 0
s += dfs(n + 1)
return n
dfs(0)
print(s)
如果我把 dfs
修改成这样:
def dfs(n):
global s
if n > 10:
return 0
i = dfs(n + 1)
s += i
return n
它就会打印出 55
我知道有更好的方法来写 dfs
。我只是想知道为什么在调用了两个 dfs
之后,s
的值会不同。
2 个回答
4
当你这样调用它的时候:
s += dfs(n + 1)
在递归调用之前,s
的初始值是没有被修改的,所以赋值操作会覆盖递归调用中所做的任何更改。
但是当你这样调用它的时候:
i = dfs(n + 1)
s += i
在递归调用之后,s
的初始值已经被修改了,所以递归调用中的更改得以保留。
一般来说,递归函数和全局变量不太搭配。递归函数需要有自己的独立环境。
8
Python 是一种从上到下逐行执行的编程语言,所以在第一个版本中,你有:
s += dfs(n + 1)
这和下面的内容是一样的:
s = s + dfs(n + 1)
当你递归调用时,堆栈中会有这些命令:
s = 0 + dfs(1) # <-- dfs(1) will return 1
s = 0 + dfs(2) # <-- dfs(2) will return 2
...
s = 0 + dfs(9) # <-- dfs(9) will return 9
s = 0 + dfs(10) # <-- dfs(10) will return 10
s = 0 + dfs(11) # <-- dfs(11) will return 0
所以当你观察时,最后一步是 s = 0 + 1
,你会看到 1
是最终结果。
第二个版本
i = dfs(n + 1)
s += i
在 dfs(n + 1)
被计算后,你再给 s
赋值,所以你看到的最终答案是 55
。
注意:如果你把第一个版本的 s += dfs(n + 1)
改成 s = dfs(n + 1) + s
,你也会看到结果是 55
。