Python如何修改矩阵指定位置元素,使其对应位置匹配另一个矩阵
问题原因分析
核心问题
问题由Python可变对象的浅拷贝特性导致,错误出在矩阵B的初始化代码:
mat_B = [[0]*C]*R #Initialise matrix B to be the same size as A
[0]*C会生成一个长度为C的独立列表,本身没有问题,但后续乘R的操作不会生成R个独立的新列表,只是把同一个子列表的引用复制了R次。也就是说mat_B中所有行都指向同一个内存地址的列表,只要修改任意一行的第j个元素,所有行的第j个元素都会同步变化,这就是你看到修改单个位置、整列都被更新的原因。
解决方案
将mat_B的初始化逻辑改为用列表推导式生成独立行即可,两种常用正确写法:
- 写法1(简洁高效):
mat_B = [[0]*C for _ in range(R)]
- 写法2(可读性更高):
mat_B = [[0 for _ in range(C)] for _ in range(R)]
修正后完整示例
if __name__ == '__main__': mat_A = [[0, 0, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 0, 0]] R = len(mat_A) # 原代码取len(mat_A[1])存在边界问题,矩阵只有1行时会报错,建议取首行长度 C = len(mat_A[0]) # 正确初始化矩阵B mat_B = [[0]*C for _ in range(R)] for i in range(R): for j in range(C): if mat_A[i][j] == 1: mat_B[i][j] = 1 print(mat_B)
运行后输出符合预期:[[0, 0, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 0, 0]]
该修改仅替换初始化逻辑,不会影响你if循环内的其他复杂业务逻辑。
内容的提问来源于stack exchange,提问作者BuggerMeNot
相关产品推荐
相关产品推荐

