Python递归中的全局变量结果不同

3 投票
2 回答
65 浏览
提问于 2025-04-12 09:12

我有这段代码,它会打印出 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

撰写回答