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中关于递归时修改全局变量失败的问题
这个问题我遇到过,递归里改全局变量确实容易踩坑。核心原因是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会把它当作局部变量,但你又没在函数内定义它。解决方法很简单:
- 使用
global声明(如第一个例子) - 通过参数传递(更推荐):
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
- 使用可变对象:
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

