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

Python实现Gridworld策略迭代时未操作数组被意外修改问题排查

问题原因分析

核心原因:数组浅拷贝导致引用绑定

你提到「while循环最开始让两个数组值一致的操作」,这一步你大概率写的是直接赋值语句arr2 = arr1,而非值拷贝。
Python中列表属于可变对象,直接赋值并不会生成新的列表副本,只会让两个变量指向内存中同一个列表对象。此时修改arr1的元素,本质上就是修改arr2指向的同一个对象,自然会出现你观察到的arr2同步变化的情况。

你初始化时的写法确实生成了两个独立的二维列表,但只要执行了arr2 = arr1,二者就会绑定到同一个对象,之前的独立初始化就失去了意义。

其他代码问题

  1. piFunc存在变量名拼写错误
    计算向下移动的状态值时,你使用了未定义的变量idx,应该改为idx1,否则代码运行会直接抛出NameError:
# 错误写法
vDown = arr[idx+1][idx2]
# 正确写法
vDown = arr[idx1+1][idx2]
  1. 迭代逻辑不符合策略迭代要求
    策略评估阶段需要用上一轮全部的旧状态值计算本轮所有新状态值,不能在旧数组上原地修改。正确的迭代流程应该是:
  • 每轮迭代开始前,先对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:24:03