You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:09:22