UnboundLocalError:局部变量'maze'赋值前引用问题求助
解决Python UnboundLocalError:局部变量'maze'赋值前引用问题
问题原因
你遇到的UnboundLocalError有两个核心原因:
- 作用域限制:
maze是main函数内的局部变量,默认无法被motion函数访问。 - 赋值触发局部变量标记:在
motion函数中,你写了maze += probs[row][col] * 0.1这类赋值语句,Python会自动将maze标记为该函数的局部变量,但你在赋值前先执行了print(maze),导致“赋值前引用”的错误。
解决方法(推荐参数传递)
最规范的方式是将motion需要的变量作为参数传入,避免使用全局变量。同时修正代码中的其他错误(比如索引误用、笔误):
修改后的motion函数
def motion(direction, maze, row, col, probs, motionPuzzle): print("entering motion") print(maze) for r in range(row): for c in range(col): if maze[r][c] != 1: total = 0.0 if direction == 1: # 修正索引为循环变量r、c,避免越界 if maze[r][c-1] != 1: total += probs[r][c-1] * 0.1 else: total += probs[r][c] * 0.1 if maze[r-1][c] != 1: total += probs[r-1][c] * 0.0 else: total += probs[r][c] * 0.8 if maze[r][c+1] != 1: total += probs[r][c+1] * 0.1 else: # 修正笔误:将maze +=改为total += total += probs[r][c] * 0.1 if maze[r+1][c] != 1: total += probs[r+1][c] * 0.8 else: total += probs[r][c] * 0.0 elif direction == 0: # 同样修正索引错误 if maze[r][c-1] != 1: total += probs[r][c-1] * 0.0 else: total += probs[r][c] * 0.8 if maze[r-1][c] != 1: total += probs[r-1][c] * 0.1 else: total += probs[r][c] * 0.1 if maze[r][c+1] != 1: total += probs[r][c+1] * 0.8 else: total += probs[r][c] * 0.0 if maze[r+1][c] != 1: total += probs[r+1][c] * 0.1 else: total += probs[r][c] * 0.1 else: pass motionPuzzle[r][c] = total else: motionPuzzle[r][c] = -1 for r in range(row): for c in range(col): probs[r][c] = motionPuzzle[r][c] return 0
修改后的main函数
def main(): row = 8 col = 9 probSenseOb = 0.8 probFalseNoOb = 0.2 probFalseOb = 0.15 probSenseNoOb = 0.85 maze = np.array([[1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,1], [1,0,1,0,0,1,0,0,1], [1,0,0,0,0,0,0,0,1], [1,0,1,0,0,1,0,0,1], [1,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,1], [1,1,1,1,1,1,1,1,1]]) probs = np.zeros([row,col]) motionPuzzle = np.zeros([row,col]) print("main initialized") # 调用motion时传入所有需要的参数,direction可根据实际需求修改 motion(1, maze, row, col, probs, motionPuzzle) if __name__ == "__main__": main()
额外说明
- 为什么不用
global?全局变量会增加代码耦合性,让调试和维护变得困难,参数传递是更清晰、更符合Python编程规范的做法。 - 代码中还存在其他错误:比如循环内误用
row/col作为索引(应该用循环变量r/c)、maze +=这类笔误,这些也会导致后续运行报错,已经在修改后的代码中修正。
内容的提问来源于stack exchange,提问作者RohitSanjay00
相关产品推荐
相关产品推荐

