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

Python字典反转时列表清空导致字典内容同步删除问题

问题根因

这是Python可变对象的引用机制导致的,不存在所谓的“同步删除”逻辑:

  • 列表是Python的可变对象,你在字典中存入列表时,存的不是列表的完整副本,而是这个列表对象的内存引用。
  • 你的代码中全程只创建了一个my_list对象,后续给new_dict不同key赋值时,传的都是这同一个列表的引用——也就是说new_dict[3]、new_dict[2]本质上指向的是内存里的同一个列表。
  • 当你执行del my_list[0:]时,是原地修改这个列表对象的内容,所有指向这个对象的引用(包括字典里已经存好的对应value)都会同步体现这个修改,看起来就像字典内容被自动删掉了。

逐行对应你代码的执行过程:

  1. 遍历前两个key 'I'、'love'时,value都是3,两个key被追加到my_list,此时my_list = ['I', 'love'],new_dict[3]指向这个列表。
  2. 遍历到第三个key 'self.py!'时,value变为2,你执行del my_list[0:]原地清空列表,此时new_dict[3]指向的列表也被清空,变成空列表。
  3. 你把'self.py!'追加到清空后的my_list,再把这个列表赋值给new_dict[2],此时new_dict里两个key指向同一个列表,最终内容就是['self.py!']。
修复方案

不要原地清空复用同一个列表对象,每遇到一个新的value分组,就创建一个全新的独立列表即可,同时去掉没必要的全局变量和冗余判断逻辑:

course_dict = {'I': 3, 'love': 3, 'self.py!': 2}

def inverse_dict(received_dict):
    new_dict = {}
    for key, value in received_dict.items():
        # 遇到新的value值时,初始化独立的空列表
        if value not in new_dict:
            new_dict[value] = []
        new_dict[value].append(key)
    return new_dict

save_dict = inverse_dict(course_dict)
print(save_dict)

运行后输出符合预期的反转结果:{3: ['I', 'love'], 2: ['self.py!']}

额外注意点:

  • 非必要不使用global全局变量,全局变量很容易放大引用复用导致的bug,用函数返回值接收结果即可。
  • 不需要提前取字典第一个value作为判断基准,遍历过程中动态判断value是否已存在于反转字典中,代码可以适配任意键值结构的输入字典。
  • 如果确实需要复制列表而不是传引用,可以用my_list.copy()或者切片my_list[:]生成副本,避免原地修改影响其他引用位置。

内容的提问来源于stack exchange,提问作者Nimrod Itz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:30:54