Python中关于递归时修改全局变量失败的问题

def dfs_maze(path, target):
global paths
maze = [[" “,”#","#"," “,” “],[” “,” “,” “,”#"," “],[”#"," “,” “,”#"," “],[” “,” “,” “,”#","#"],[" “,” “,” “,” “,” "]]

if path[-1] == target:
paths.append(path)
print(path)
return
for each in [[0,1], [0,-1], [1, 0], [-1, 0]]:
node = [path[-1][0] + each[0], path[-1][1] + each[1]]
if -1 not in node and 5 not in node and node not in path and maze[node[0]][node[1]] != ‘#’:
path.append(node)
dfs_maze(path, target)
path.pop(-1)

def main():
dfs_maze([[0,0]], [4, 4])

for each in paths:
print(each)
paths = []
main()

就是一个深搜解决迷宫最短路径的函数,path 是一个二维数组,储存已经走过的每一个点,target 是终点。在边界条件满足时,打印出来的路径是没问题的。但在深搜结束后,打印出来的 paths 是一堆[[0,0]]的二维数组,这是为何?
不知为啥没有代码排版,sorry…
Python中关于递归时修改全局变量失败的问题


2 回复

这个问题我遇到过,递归里改全局变量确实容易踩坑。核心原因是Python的变量作用域规则,特别是在递归这种多层函数调用场景下。

看个典型例子:

count = 0

def recursive_func(n):
    global count
    if n <= 0:
        return
    count += 1
    recursive_func(n-1)

recursive_func(5)
print(count)  # 输出5,正确

但很多人会写成这样:

count = 0

def recursive_func(n):
    if n <= 0:
        return
    count += 1  # 这里会报错!
    recursive_func(n-1)

recursive_func(5)

错误原因是:在函数内部对count赋值时,Python会把它当作局部变量,但你又没在函数内定义它。解决方法很简单:

  1. 使用global声明(如第一个例子)
  2. 通过参数传递(更推荐):
def recursive_func(n, count=0):
    if n <= 0:
        return count
    return recursive_func(n-1, count+1)

result = recursive_func(5)
print(result)  # 输出5
  1. 使用可变对象
count = [0]

def recursive_func(n):
    if n <= 0:
        return
    count[0] += 1
    recursive_func(n-1)

recursive_func(5)
print(count[0])  # 输出5

建议用参数传递的方式,这样代码更清晰,也避免了全局状态带来的副作用。


从新弄一个在线的 playground 版本的代码吧,尤其 Python 这种依赖缩进语言,10 个人有 9.99 个没耐心看这种没排版的代码。随手一搜,比如这个: https://www.katacoda.com/courses/python/playground

回到顶部