二维数组填充异常:修改单个元素触发整列值变更的原因及修复
问题成因与修复方案
问题成因
你用c = [[0] * k] * n创建二维数组的方式存在本质问题——Python并没有生成n个独立的长度为k的列表,而是把同一个列表对象重复引用了n次。换句话说,c[0]、c[1]……c[n-1]指向的是内存里的同一个列表。就像你复制了n把开同一个箱子的钥匙,不管用哪把钥匙改箱子里的东西,所有钥匙打开的箱子内容都会同步变化。所以修改c[i][b]时,本质是修改了这个共享列表的第b个元素,所有行的同列元素自然会跟着变更。
修复方法
把二维数组的创建代码换成列表推导式,让每一行都生成一个独立的新列表:
c = [[0] * k for _ in range(n)]
直接替换原来的c = [[0] * k] * n这一行即可。
修复原理
列表推导式会循环执行n次,每次都会生成一个全新的[0] * k列表。这样c里的每一行都是内存中的独立对象,修改某一行的某列元素时,只会影响当前行的对应位置,其他行的同列元素不会再同步变动。
内容的提问来源于stack exchange,提问作者narcel
相关产品推荐
相关产品推荐

