Python3更新二维列表出现异常行为,如何正确初始化MxN矩阵?
问题根因
你遇到的是Python嵌套列表批量初始化的经典引用陷阱,从你的预期结果来看,你实际想初始化的是4行1列的矩阵,原代码的参数写反了,同时使用*做嵌套列表复制的方式本身有问题:
- Python中使用
[子列表] * n的写法生成嵌套列表时,不会创建n个独立的子列表,只会复制n次同一个子列表的内存引用。所有外层列表的元素指向同一个子列表对象,修改任意一个子列表的元素,所有子列表都会同步变化。 - 如果你写的是
a = [[0]*1]*4(符合你预期的4行1列结构),那么4个[0]其实是同一个列表,修改a[0][0]自然会让所有位置的元素同步变成1。
正确的MxN矩阵初始化方案
要完全规避引用问题,推荐用列表推导式生成独立的子列表:
基础通用写法
生成M行N列的0矩阵,通用写法如下:
# M是行数,N是列数 matrix = [[0 for _ in range(N)] for _ in range(M)]
比如你要生成4行1列的矩阵,对应写法是:
a = [[0 for _ in range(1)] for _ in range(4)]
如果要生成1行4列的矩阵,对应写法是:
a = [[0 for _ in range(4)] for _ in range(1)]
简化写法
因为数字、字符串这类不可变类型的批量复制不会产生引用问题,内层一维列表可以用*简化:
# 4行1列 a = [[0]*1 for _ in range(4)] # 1行4列 a = [[0]*4 for _ in range(1)]
效果验证
用上述方法初始化后,执行a[0][0] = b[0][0],就能得到你预期的[[1], [0], [0], [0]]结果,不会再出现所有元素同步修改的问题。
内容的提问来源于stack exchange,提问作者user17076059
相关产品推荐
相关产品推荐

