Python二维列表浅拷贝后同步修改异常的技术咨询
为什么修改3*3二维列表grid时,oldgrid也跟着变?
这个问题的核心在于浅拷贝和深拷贝的区别,咱们来一步步拆解:
你用oldgrid = grid[:]做的是浅拷贝——这种操作只会复制外层列表的结构,生成一个新的外层列表对象(这也是为什么你打印id(oldgrid)和id(grid)会得到不同结果),但外层列表里的每个子列表(也就是那些[2,1,1]、[1,1,0]这类一维列表),其实还是指向原来的内存地址。简单说就是:oldgrid和grid是两个不同的“容器”,但它们装的“小容器”是完全一样的。
你可以做个小验证,打印子列表的id:
print(id(grid[1]), id(oldgrid[1]))
你会发现这两个id是相同的,说明grid[1]和oldgrid[1]是同一个列表对象。所以当你修改grid[1][1]时,本质是在修改这个共享的子列表里的元素,oldgrid自然也会同步变化。
解决方案
要彻底让两个二维列表完全独立,你需要用到深拷贝,也就是递归复制所有层级的元素。Python的copy模块里的deepcopy()方法就能做到这一点:
import copy # 替换原来的oldgrid = grid[:] oldgrid = copy.deepcopy(grid)
这样操作后,oldgrid不仅外层列表是新的,里面的每个子列表也都是全新的对象,修改grid的任何元素都不会影响oldgrid了。
内容的提问来源于stack exchange,提问作者Mercury
相关产品推荐
相关产品推荐

