无第三方库实现矩阵赋值异常:单元素修改引发多行同步变更
问题:修改矩阵元素时所有行对应位置均被改动
原代码
def create_matrix(xy): matrix = [] matrix_y = [] x = xy[0] y = xy[1] for z in range(y): matrix_y.append(0) for n in range(x): matrix.append(matrix_y) return matrix def set_matrix(matrix,xy,set): x = xy[0] y = xy[1] matrix[x][y] = set return matrix index = [4,5] index_2 = [3,4] z = create_matrix(index) z = set_matrix(z,index_2, 12) print(z)
输出结果
[[0, 0, 0, 0, 12], [0, 0, 0, 0, 12], [0, 0, 0, 0, 12], [0, 0, 0, 0, 12]]
问题原因
你在create_matrix函数里犯了一个常见的引用错误:先创建了一个单独的matrix_y列表,然后循环把这个同一个列表的引用添加到matrix中。矩阵里的每一行其实都是指向同一个列表对象,修改其中任意一行的元素,都会同步影响所有行。
解决方案
修改create_matrix函数,在每次循环中创建新的行列表,确保每一行都是独立的对象:
def create_matrix(xy): matrix = [] x = xy[0] y = xy[1] # 每次循环生成新的行列表,避免引用复用 for n in range(x): matrix_y = [] for z in range(y): matrix_y.append(0) matrix.append(matrix_y) return matrix def set_matrix(matrix, xy, val): x = xy[0] y = xy[1] matrix[x][y] = val return matrix index = [4,5] index_2 = [3,4] z = create_matrix(index) z = set_matrix(z, index_2, 12) print(z)
修正后输出
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 12]]
也可以用列表推导式简化create_matrix的写法,更简洁高效:
def create_matrix(xy): x, y = xy return [[0 for _ in range(y)] for _ in range(x)]
内容的提问来源于stack exchange,提问作者mzama
相关产品推荐
相关产品推荐

