Python循环为字典赋值列表值时所有值相同的修复
核心问题定位
代码出现异常结果的根本原因和两处细节缺陷:
- Python中列表是可变引用类型,你全流程只初始化了一个全局列表
A,所有存入out1字典的值,本质都是这个同一个A的内存引用,不是独立的列表副本 - 后续对
A执行的append、clear操作,会直接修改所有已经存入字典的内容——因为所有字典值指向的都是同一块内存,最后自然所有位置都会被最后一组[-2,-2,-2,-2]的内容覆盖 - 连续相同元素的分支里,重复执行
out1[s] = A是无意义操作:键s没有变化,重复赋值的对象也是同一个引用,不会产生任何新的存储效果
修复方案
只要把“复用同一个全局列表A”的逻辑换掉,每个分组对应独立的列表实例,就可以得到预期结果,修正后的代码如下:
vo = [6, 5, 4, 4, 1, 0, -2, -2, -2, -2] out1 = {} # 初始化第一组,直接创建独立列表 current_group = [vo[0]] start_pos = 1 out1[start_pos] = current_group for i in range(1, len(vo)): if vo[i] == vo[i-1]: # 同组元素直接追加到当前分组列表即可,无需重复写字典 current_group.append(vo[i]) else: # 计算下一组的起始索引 start_pos += len(current_group) # 关键:新分组直接创建全新的独立列表,不复用、不清空旧列表 current_group = [vo[i]] out1[start_pos] = current_group
运行修正后的代码,输出完全匹配预期:
{1: [6], 2: [5], 3: [4, 4], 5: [1], 6: [0], 7: [-2, -2, -2, -2]}
容易踩的细节提醒
- 绝对不要遇到新分组时,用对旧列表
clear()再append的方式生成新组:这种操作本质还是在修改原来的列表对象,已经存在字典里的旧分组内容依然会被覆盖 - 连续相同元素的分支不需要重复给字典赋值:只要键不变,字典里存的就是当前分组的列表引用,直接修改列表内容即可同步生效
内容的提问来源于stack exchange,提问作者Mohammad Saeidi
相关产品推荐
相关产品推荐

