5×5输入转二维数组遇异常:修改arr[0][0]致同列元素同步变更求助
问题:5×5输入转二维数组时同列元素同步变化
我要把5×5的输入转换成二维数组,写完代码后输出结果不符合预期。发现修改arr[0][0]的值时,arr[1][0]、arr[2][0]等同列元素都会跟着变,不知道问题出在哪。
我的代码如下:
side = 5 L = [] a = [] arr=[[0]*side]*side for o in range(5): i = input() a.append(i) d = 0 for i in a: c = 0 for b in i: L.append(b) arr[d][c] = L.pop(0) c += 1 d += 1 print(arr)
问题根源
问题出在二维数组的创建方式:arr=[[0]*side]*side。这行代码里,[[0]*side]创建了一个列表,然后*side是把这个列表的引用复制了side次。也就是说,数组里的每一行其实都是同一个列表对象,修改任意一行的某个元素,其他行对应位置的元素都会同步变化——因为它们指向的是同一个内存地址。
解决方法
把二维数组的创建方式改成列表推导式,这样每一行都是独立的新列表:
arr = [[0]*side for _ in range(side)]
另外,你的代码可以简化,不需要额外的L列表,直接遍历输入的每个字符赋值即可:
side = 5 arr = [[0]*side for _ in range(side)] for d in range(side): line = input().strip() for c in range(side): arr[d][c] = line[c] print(arr)
内容的提问来源于stack exchange,提问作者Kaylub Hsu
相关产品推荐
相关产品推荐

