关于 python 字典报错 dictionary changed size during iteration 的理解

2024-09-01 17:20

本文主要是介绍关于 python 字典报错 dictionary changed size during iteration 的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有时在 python 中对字典进行遍历迭代过程中,会提示错误 dictionary changed size during iteration,这说明你对遍历迭代的条件设置一定是错误的,你的遍历(迭代)过程在改变字典长度(无论是删除还是增加),而你的遍历(迭代)的依据却直接来自这个字典,这是 python 不能接受的,所以会报错,

为什么说遍历(迭代)的依据直接来自字典是不可以的,

请看下面的代码:

一个字典:dic1={1: 1, 2: 2, 3: 3, 4: 4}
拿走字典中值为3的倍数对应的元素for k,v in dic1.items():if v % 3 ==0:dic.pop(k)

直接报错,如下:

RuntimeError
----> for k,v in dic1.items():
RuntimeError: dictionary changed size during iteration

这个报错的根本原因是循环条件语句的dic1.items()问题,
for k,v in dic1.items()

先来看一下,dic.items()里面有什么,

在这里插入图片描述
有一个列表:[(1, 1), (2, 2), (4, 4)]
但这里请注意,dic1.items() 的结果 dict_items([(1, 1), (2, 2), (3, 3), (4, 4)]) 看起来是一个列表,但它实际上绑定dic1.items(),是一个关于 dic1.items()的特殊类型,而不是一个普通的列表,因为它是以 dic1_items 开头,也就是被dic1_items()包裹着,因此它不是一个普通的列表那么简单,
我们可以通过查看 dic1.items() 的结果(也就是这个特殊的酷似列表的 python 数据类型)的类型,如下:

在这里插入图片描述

那么说,通过dic1.items()得到的列表是绑定着dic1.items(),也就是 dict_items([(1, 1), (2, 2), (3, 3), (4, 4)]) 绑定着字典 dic1,所以

for k,v in dic1.items()  

这个循环语句也绑定着字典 dic1,因此,在此循环内部对字典 dic1的增删(改变字典长度的操作)就会触发告警。

dic1.items  是个特殊的 python 数据类型,
虽然它不是列表,但是可以像处理列表一样的操作它

最简单的解除与 字典 dic1 绑定的方法就是:
做一个真正的列表出来

list(dic1.items())
[(1, 1), (2, 2), (4, 4)]

这时,它是一个真正的列表和字典没有绑定关系,自然也就不会影响到字典的长度,就不会报错了,

在这里插入图片描述

    for k,v in list(dic1.items()):if v % 3 ==0:dic.pop(k)运行时循环的条件语句不会再与字典 dic1 有关联,自然也就不会报错了。
dictionary changed size during iteration

另外还有其他的办法,比如生成一个此字典的副本,然后循环条件与字典副本绑定,循环体去操作原字典……

August2024the30thFriday

REPLENISH:

另外还有其他的办法,比如生成一个此字典的副本
生成字典的副本,这个要注意,把字典简单的赋值给一个变量,并不是真正的生成字典的副本,这涉及到 python 深复制、浅复制的问题,以及内存指针的指向(简单赋值,指向的是同一片内存地址),这里不做过多的探讨,只要知道生成字典的副本要用到 字典.copy() 函数,
先举一个没有使用字典.copy() 函数的错误例子,如下:

在这里插入图片描述
使用了字典.copy() 函数,不再报错的正确例子,如下:

在这里插入图片描述

August2024the31thSaturday

这篇关于关于 python 字典报错 dictionary changed size during iteration 的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127573

相关文章

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.