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
相关产品推荐
相关产品推荐

