【发布时间】:2020-11-13 14:23:05
【问题描述】:
我想我刚刚在 Python 中发现了一个问题。
看看下面的代码:
a = {'a':1, 'b':2, 'c':3}
for i in a.values():
if i == 2:
a['d'] = 4
print(a)
这将导致运行时错误:
Traceback (most recent call last):
File "<string>", line 4, in <module>
RuntimeError: dictionary changed size during iteration
我来自 Java 背景所以在迭代数据结构时实际上无法修改数据结构是有道理的。
但是当您看到以下代码对列表正常工作时,这个逻辑就崩溃了:
a = [1,2,3,4]
for i in iter(a):
if i == 2:
a.extend([5,6,7])
print(a)
代码按预期输出:
[1, 2, 3, 4, 5, 6, 7]
为什么这对列表有效,但对字典无效?
这毫无意义。
我知道dict.values()、dict.items()、dict.keys() 都返回迭代器但列表也是如此。
这段代码使用了迭代器,对吧?
a = [1,2,3,4]
for i in iter(a):
if i == 2:
a.extend([5,6,7])
print(a)
如果我错了,请纠正我。
我确实检查了this answer,但我没有得到具体的答案。
为什么要对字典进行特殊处理?
我在这里遗漏了一些非常基本的东西吗?
【问题讨论】:
-
for x in a不是迭代器,其中任何一个都不是标准的一部分。在 Python 的其他实现中,您可能会得到不同的结果 -
@Marat 现在检查我的代码。我专门使用带有列表的迭代器。
-
第二部分仍然有效,这是一个未定义的行为。这不是语言设计的有意部分
-
"我知道 dict.values()、dict.items()、dict.keys() 都返回迭代器...." 不,技术上是 they return views。
-
FWIW,
iter(a)不需要重现相同的行为。
标签: python dictionary iterator