Python二维列表append的值与预期不符,copy()未生效是什么原因?
问题根源
你对copy()方法的认知有误,Python 中列表自带的copy()方法属于浅拷贝,仅会复制外层列表的结构,不会递归复制嵌套的子列表。
你定义的mat是二维列表,外层列表存储的是两个子列表[0,0,0,0]和[6,7,8,9]的内存引用,浅拷贝后新生成的外层列表里,存的还是和原列表完全相同的子列表引用。所以你后续修改原mat[0][x]的值时,所有浅拷贝得到的列表对应位置也会同步变化。
解决方法
方法1:使用深拷贝
导入标准库copy的deepcopy方法,它会递归复制所有层级的嵌套对象,完全隔离新旧列表:
import copy mat = [ [0,0,0,0], [6,7,8,9] ] listOfMats = [] for x in range(4): mat[0][x] = 1 listOfMats.append(copy.deepcopy(mat)) mat[0][x] = 0
方法2:手动构造新列表(更轻量)
你这个场景下无需修改原列表,直接每次生成新的目标矩阵即可,性能更高也不会有拷贝问题:
listOfMats = [] for x in range(4): new_mat = [ [1 if i == x else 0 for i in range(4)], [6,7,8,9] ] listOfMats.append(new_mat)
内容的提问来源于stack exchange,提问作者CoolGuy
相关产品推荐
相关产品推荐

