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

Python列表append后内容不一致?Hexapawn游戏AI开发引用问题

问题根源

Python中列表属于可变对象,你直接将board变量追加到moves_ai列表时,实际存储的是board的内存引用,而非当前时刻的棋盘数据快照。后续你修改原始board的内容时,所有引用了该地址的条目都会同步更新为最新的棋盘状态,所以会出现所有条目内的棋盘数据都变成最终状态的问题。
这和你给出的简易复现代码的逻辑完全一致:两次追加的都是同一个列表的引用,修改原始列表后所有引用的位置都会同步变化。

解决方法

追加棋盘数据时,存储当前棋盘的深拷贝即可,因为棋盘是嵌套列表,普通浅拷贝无法复制内层的子列表,需要使用copy模块的deepcopy方法:

  1. 首先在代码开头导入copy模块:
import random
import copy
  1. 修改move函数中往moves_ai追加数据的两处逻辑,将原board替换为copy.deepcopy(board):
# 玩家1走法的追加逻辑
moves_ai.append([row, col, row + 1, col, copy.deepcopy(board)])
# 玩家2走法的追加逻辑
moves_ai.append([row, col, row - 1, col, copy.deepcopy(board)])
  1. 后续如果有往forbiden_moves_ai中存储棋盘的需求,也需要同样使用深拷贝,避免出现相同的引用问题。

简易复现问题的修正代码

l = []
num = [1]
l.append(num.copy())
num[0] = 9
l.append(num.copy())
print(l) # 输出为[[1], [9]],符合预期

内容的提问来源于stack exchange,提问作者Abhijit Prajapati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:06:06