You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UnboundLocalError:局部变量'maze'赋值前引用问题求助

解决Python UnboundLocalError:局部变量'maze'赋值前引用问题

问题原因

你遇到的UnboundLocalError有两个核心原因:

  1. 作用域限制:maze是main函数内的局部变量,默认无法被motion函数访问。
  2. 赋值触发局部变量标记:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:25:17