Python递归迷宫求解函数使用可变默认参数是否属于合理场景?
关于迷宫递归函数可变默认参数问题的解答
首先明确:你当前代码运行无问题是特殊场景下的巧合,不属于可变默认参数的合理使用场景
你现在没踩坑完全是两个前提共同作用:- 递归调用时你全程没有使用默认的
path参数,每次都显式传入新生成的[[i, j]] + path列表 - 你全程没有对
path做append、pop等原地修改操作,不会修改到函数定义时生成的那个默认列表对象
但这种写法完全不可靠,只要后续代码修改时加了任何原地修改path的逻辑,或者你连续多次对外调用solve_maze不传path参数,就会出现隐蔽的残留数据bug,排查成本极高。
- 递归调用时你全程没有使用默认的
标准规范写法并不冗余
你提到的path=None的写法是Python社区公认的标准方案,建议调整为更严谨的is None判断,避免用户主动传入空列表时被误判为默认情况:def solve_maze(self, i=0, j=0, path=None): if path is None: path = [] # 原有逻辑不变这两行代码完全不属于冗余,是所有Python开发者都能秒懂的防御性写法,也能通过所有静态检查工具的校验,符合PEP8规范。
更优雅的实现方案:分离对外接口和内部递归逻辑
你可以把公共调用接口和内部递归实现拆分,彻底规避默认参数的问题,同时对外接口更干净,不需要暴露内部递归用的path参数:# 对外暴露的公共方法,无需用户传递path参数 def solve_maze(self, i=0, j=0): self.memory.clear() # 建议加这行,避免多次调用时memory有残留数据 return self._solve_maze_recursive(i, j, []) # 内部私有的递归实现,不需要写默认参数 def _solve_maze_recursive(self, i, j, path): if (i, j) in self.memory: return False if self.maze[i][j] == 'D': return path[:-1] if not (directions := self.get_directions(i, j, [[i, j]] + path)): self.memory.append((i, j)) return False move = {'l': [i, j-1], 'u': [i-1, j], 'r': [i, j+1], 'd': [i+1, j]} for k in range(len(directions)): best_dir = directions[k] if solution := self._solve_maze_recursive(move[best_dir][0], move[best_dir][1], [[i, j]] + path): return solution self.memory.append((i, j)) return False这种写法也顺便解决了你现有代码里可能存在的
self.memory多次调用残留数据的问题,在公共方法里先清空记忆数组更合理。
内容的提问来源于stack exchange,提问作者NewBoard
相关产品推荐
相关产品推荐

