Python列表append后内容不一致?Hexapawn游戏AI开发引用问题
问题根源
Python中列表属于可变对象,你直接将board变量追加到moves_ai列表时,实际存储的是board的内存引用,而非当前时刻的棋盘数据快照。后续你修改原始board的内容时,所有引用了该地址的条目都会同步更新为最新的棋盘状态,所以会出现所有条目内的棋盘数据都变成最终状态的问题。
这和你给出的简易复现代码的逻辑完全一致:两次追加的都是同一个列表的引用,修改原始列表后所有引用的位置都会同步变化。
解决方法
追加棋盘数据时,存储当前棋盘的深拷贝即可,因为棋盘是嵌套列表,普通浅拷贝无法复制内层的子列表,需要使用copy模块的deepcopy方法:
- 首先在代码开头导入
copy模块:
import random import copy
- 修改
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)])
- 后续如果有往
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
相关产品推荐
相关产品推荐

