Python字典遍历修改键的避坑实战案例

 更新时间:2026年06月26日 09:13:58   作者:风骏时光少年  
字典是Python中非常强大的工具,但在使用时需要注意其特性和限制,通过理解这些典型错误及其纠正方法,可以避免常见的陷阱,这篇文章主要介绍了Python字典遍历修改键避坑实战案例的相关资料,需要的朋友可以参考下

一、问题概述

Python字典底层基于哈希表实现,在遍历字典keys()items()values()过程中,直接新增、删除字典键会触发迭代器失效,抛出RuntimeError: dictionary changed size during iteration运行时错误。该问题是Python新手高频踩坑点,报错逻辑隐蔽,很多开发者不清楚底层迭代机制,写出能一次性运行、循环中途崩溃的代码。

和列表遍历删除元素类似,字典迭代器会记录哈希表当前长度,循环过程中字典长度发生变化,迭代器与容器状态不匹配,解释器直接抛出运行时异常终止程序。本文通过错误复现、根源分析、多种修复方案完整演示该场景。

二、错误代码复现

2.1 删除字典键触发报错

def remove_odd_key():
    data = {1: "苹果", 2: "香蕉", 3: "橙子", 4: "葡萄"}
    # 直接遍历字典键并删除
    for k in data.keys():
        if k % 2 != 0:
            del data[k]
    print(data)

if __name__ == "__main__":
    remove_odd_key()

执行后报错信息:

RuntimeError: dictionary changed size during iteration

2.2 新增字典键同样触发异常

删除键会改变字典长度,新增键也会触发完全相同的报错:

def add_new_key():
    data = {"a": 10, "b": 20}
    for k in data.keys():
        new_k = k + "_new"
        data[new_k] = data[k] * 2
    print(data)

if __name__ == "__main__":
    add_new_key()

循环每新增一个键,字典容量发生变动,迭代器校验失败,程序中断。

三、底层根源分析

  1. Python3中dict.keys()返回动态视图对象,而非静态列表,视图实时绑定原字典;
  2. 迭代启动时,迭代器记录字典当前条目总数,每完成一次循环会校验字典条目数量;
  3. 循环内执行del删除键、赋值新增键,字典条目增减,前后数量不一致,解释器判定迭代环境被破坏,抛出运行时错误;
  4. 区别于Python2,Python2中dict.keys()返回列表,遍历静态副本不会报错,但存在数据滞后问题,不推荐兼容写法。

四、三种标准修复方案

方案1:遍历键的静态副本(最常用)

keys()转为列表生成静态快照,遍历副本,修改原字典互不干扰:

def fix_remove_by_copy():
    data = {1: "苹果", 2: "香蕉", 3: "橙子", 4: "葡萄"}
    # list()生成静态键列表,与原字典解耦
    for k in list(data.keys()):
        if k % 2 != 0:
            del data[k]
    print(data)
# 输出 {2: '香蕉', 4: '葡萄'}

方案2:收集待操作键,循环结束统一修改

先筛选需要新增/删除的键存入临时列表,遍历完成后批量操作字典,全程不破坏迭代环境:

def fix_batch_modify():
    data = {"a": 10, "b": 20}
    add_list = []
    # 仅筛选,不修改原字典
    for k in data.keys():
        add_list.append((k + "_new", data[k] * 2))
    # 循环结束后统一新增
    for new_k, val in add_list:
        data[new_k] = val
    print(data)

方案3:字典推导式重构(简洁高效)

无需循环遍历,直接通过推导式生成全新字典,过滤不需要的键,性能最优:

def fix_by_comprehension():
    data = {1: "苹果", 2: "香蕉", 3: "橙子", 4: "葡萄"}
    # 仅保留偶数键,生成新字典
    new_data = {k: v for k, v in data.items() if k % 2 == 0}
    print(new_data)

五、避坑实操总结

  1. 禁止在for k in dict.keys()for k,v in dict.items()循环内直接增删字典键;
  2. 快速修复优先使用list(dict.keys())创建静态副本,适配简单删除场景;
  3. 批量新增、复杂业务逻辑推荐预存待操作键,循环结束统一修改;
  4. 过滤、筛选场景优先字典推导式,代码简洁且无迭代风险;
  5. 区分动态视图dict_keys与静态列表,视图会实时跟随字典变动,列表是固定快照。

到此这篇关于Python字典遍历修改键避坑实战的文章就介绍到这了,更多相关Python字典遍历修改键内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现决策树分类(2)

    python实现决策树分类(2)

    这篇文章主要介绍了python实现决策树分类的相关资料,用于实际的数据分类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • python中的列表和元组实例详解

    python中的列表和元组实例详解

    在Python中序列是最基本的数据结构,它是一块用于存放多个值得连续内存空间,Python中内置了5个常用的序列结构,分别是列表、元组、集合、字典和字符串,本文将详细讲解python中的列表和元组,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • 如何判断pytorch是否支持GPU加速

    如何判断pytorch是否支持GPU加速

    这篇文章主要介绍了判断pytorch是否支持GPU加速的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python通过win32com库操作Word的详细教程

    Python通过win32com库操作Word的详细教程

    在 Python 生态中,操作 Word 文档的库有不少,比如 python-docx 主要处理 .docx 格式,而 win32com则提供了更为底层的控制能力,不仅可以读写文本,还能操作表格等,本文给大家介绍了Python通过win32com库操作Word的详细教程,需要的朋友可以参考下
    2026-03-03
  • Python3爬虫使用Fidder实现APP爬取示例

    Python3爬虫使用Fidder实现APP爬取示例

    这篇文章主要介绍了Python3爬虫使用Fidder实现APP爬取示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Python3.x检查内存可用大小的两种实现

    Python3.x检查内存可用大小的两种实现

    本文将介绍如何使用Python 3实现检查Linux服务器内存可用大小的方法,包括使用Python标准库实现和使用Linux命令实现两种方式,感兴趣可以了解一下
    2023-05-05
  • Python3监控疫情的完整代码

    Python3监控疫情的完整代码

    这篇文章主要介绍了Python3监控疫情的完整代码,代码简单易懂,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • python爬虫自动创建文件夹的功能

    python爬虫自动创建文件夹的功能

    这篇文章主要介绍了python爬虫自动创建文件夹的功能,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-08-08
  • 使用Python实现高效复制Excel行列与单元格

    使用Python实现高效复制Excel行列与单元格

    在日常办公自动化或数据处理场景中,复制 Excel 中的单元格、行、列是高频需求,下面我们就来看看如何使用Free Spire.XLS for Python实现这些操作吧
    2025-11-11
  • python中prettytable库的使用方法

    python中prettytable库的使用方法

    prettytable是Python的一个第三方工具库,用于创建漂亮的ASCII表格,本文主要介绍了python中prettytable库的使用方法,使用prettytable可以轻松地将数据可视化为表格,感兴趣的可以了解一下
    2023-08-08

最新评论