本文主要是介绍关于 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 的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!