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

Python使用列表实现按标签分组时结果不符预期的错误排查

问题说明

编写Python代码期望实现按数值对应的标签对数值分组的功能,原代码如下:

labels = [0, 0, 0,  1, 1,  2]
values = [1, 3, 5,  6, 7,  8]    

groups = [[]]*3

for i in range(len(values)): 
    groups[labels[i]] += [values[i]]

print(groups)

预期运行输出为:

[[1,3,5], [6,7], [8]]

实际运行得到三个完全一致的列表,每个列表都包含全部输入数值:

[[1, 3, 5, 6, 7, 8], [1, 3, 5, 6, 7, 8], [1, 3, 5, 6, 7, 8]]
问题原因

核心错误出在groups = [[]]*3这行初始化逻辑上:

  • 这种写法不会创建3个独立的空列表,只会创建3个指向同一个内存地址的空列表的引用
  • 后续循环中不管你往groups[0]、groups[1]还是groups[2]里追加元素,本质上都是在修改那唯一的一个列表对象
  • 最终打印groups时,三个位置引用的是同一个已经被塞满所有元素的列表,自然会出现三个列表完全一致的结果
修复方案

将嵌套列表的初始化逻辑从乘法复制改为列表推导式,为每个分组生成独立的空列表对象即可,修复后完整代码:

labels = [0, 0, 0,  1, 1,  2]
values = [1, 3, 5,  6, 7,  8]    

# 生成3个独立的空列表,避免引用同一个对象
groups = [[] for _ in range(3)]

for i in range(len(values)): 
    groups[labels[i]] += [values[i]]

print(groups)

运行上述代码即可得到预期输出:

[[1, 3, 5], [6, 7], [8]]

注意:Python中使用*乘法创建包含可变对象(列表、字典、自定义类实例等)的嵌套结构时,只会复制对象引用、不会生成独立的新对象,这是非常常见的语法坑。

内容的提问来源于stack exchange,提问作者Leonard Neon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.06 16:15:43