Python实现Gridworld策略迭代时未操作数组被意外修改问题排查
问题原因分析
核心原因:数组浅拷贝导致引用绑定
你提到「while循环最开始让两个数组值一致的操作」,这一步你大概率写的是直接赋值语句arr2 = arr1,而非值拷贝。
Python中列表属于可变对象,直接赋值并不会生成新的列表副本,只会让两个变量指向内存中同一个列表对象。此时修改arr1的元素,本质上就是修改arr2指向的同一个对象,自然会出现你观察到的arr2同步变化的情况。
你初始化时的写法确实生成了两个独立的二维列表,但只要执行了arr2 = arr1,二者就会绑定到同一个对象,之前的独立初始化就失去了意义。
其他代码问题
- piFunc存在变量名拼写错误
计算向下移动的状态值时,你使用了未定义的变量idx,应该改为idx1,否则代码运行会直接抛出NameError:
# 错误写法 vDown = arr[idx+1][idx2] # 正确写法 vDown = arr[idx1+1][idx2]
- 迭代逻辑不符合策略迭代要求
策略评估阶段需要用上一轮全部的旧状态值计算本轮所有新状态值,不能在旧数组上原地修改。正确的迭代流程应该是:
- 每轮迭代开始前,先对arr1做深拷贝赋值给arr2,作为本轮计算用的固定旧值
- 遍历所有非终止状态,用arr2的旧值计算新值,全部写入arr1
- 计算arr1和arr2的差异,判断是否收敛
二维列表的正确深拷贝写法参考:
# 写法1:逐层拷贝子列表 arr2 = [row.copy() for row in arr1] # 写法2:用copy模块的深拷贝方法 import copy arr2 = copy.deepcopy(arr1)
内容的提问来源于stack exchange,提问作者satazero
相关产品推荐
相关产品推荐

