为什么修改一个Python列表另一个也变动?如何避免原列表被篡改
问题原因与解决方法
问题根源
- 直接赋值
newboard = board没有创建新的列表对象,只是给原列表新增了一个引用别名,修改newboard的元素等价于直接修改原startboard。 - 你尝试的
board[:][:]仅能完成外层列表的浅拷贝,二维列表内部的子列表仍然和原列表共享内存引用,修改子列表元素依然会同步到原列表。
解决方案
有两种常用实现方式:
方案1:手动逐层拷贝(适用于固定层级的二维列表)
通过列表推导式对每一行子列表单独做拷贝,性能更高,代码修改为:
def moves(board, player): boardlist=[] for x in range(7): # 逐行拷贝生成完全独立的新列表 newboard = [row.copy() for row in board] if board[5][x]==0: place=0 if player: newboard[place][x]=1 else: newboard[place][x]=2 boardlist.append(newboard) return boardlist
方案2:使用copy模块的深拷贝(适用于任意层级的嵌套结构)
如果列表嵌套层级不固定,可以调用Python标准库的递归深拷贝方法:
import copy def moves(board, player): boardlist=[] for x in range(7): # 递归完成全层级深拷贝 newboard = copy.deepcopy(board) if board[5][x]==0: place=0 if player: newboard[place][x]=1 else: newboard[place][x]=2 boardlist.append(newboard) return boardlist
两种方案都可以完全隔离新列表和原列表的内存关联,修改newboard不会再影响原startboard的值。
内容的提问来源于stack exchange,提问作者Kevin Johnson
相关产品推荐
相关产品推荐

