Python嵌套循环错误更新数组值:为何条件判断失效?
Python列表初始化导致的赋值异常问题
输入代码
mat = [[0,0,1], [1,0,0], [0,0,0]] arr = [[float('inf')]*3]*3 for i in range(3): for j in range(3): if mat[i][j] == 0: arr[i][j] = 0 print(arr)
期望输出
[[0, 0, inf], [inf, 0, 0], [0, 0, 0]]
实际输出
[[0,0,0], [0,0,0], [0,0,0]]
问题原因
你犯了Python列表初始化的常见错误:[[float('inf')]*3]*3这种写法并没有创建3个独立的子列表,而是把同一个子列表对象复制了3次。也就是说,arr[0]、arr[1]、arr[2]指向的是内存中的同一个列表。
当你在循环里修改arr[i][j] = 0时,本质是在修改那个唯一的子列表的元素。比如第一次修改arr[0][0]为0,另外两个子列表的第0个元素也会同步变成0;后续所有符合条件的赋值操作,都会让这个共享的子列表里的元素逐个变成0,最后就得到了全0的结果。
解决方案
要创建包含独立子列表的二维列表,改用列表推导式初始化:
mat = [[0,0,1], [1,0,0], [0,0,0]] # 用列表推导式生成独立的子列表 arr = [[float('inf')]*3 for _ in range(3)] for i in range(3): for j in range(3): if mat[i][j] == 0: arr[i][j] = 0 print(arr)
或者手动逐个添加子列表:
arr = [] for _ in range(3): arr.append([float('inf')]*3)
这样每个子列表都是独立的对象,修改其中一个不会影响其他子列表,就能得到你期望的输出。
内容的提问来源于stack exchange,提问作者dpbrewer
相关产品推荐
相关产品推荐

