【发布时间】:2023-04-05 05:21:02
【问题描述】:
让我们考虑一下这段代码,它在每次迭代中删除一个项目时迭代 list:
x = list(range(5))
for i in x:
print(i)
x.pop()
它将打印0, 1, 2。由于列表中的最后两个元素在前两次迭代中被删除,因此只打印前三个元素。
但是如果你在 dict 上尝试类似的东西:
y = {i: i for i in range(5)}
for i in y:
print(i)
y.pop(i)
它将打印0,然后引发RuntimeError: dictionary changed size during iteration,因为我们在迭代时从字典中删除了一个键。
当然,在迭代期间修改列表是不好的。但是为什么 RuntimeError 不像字典那样被提出呢?这种行为有什么好的理由吗?
【问题讨论】:
-
如果可以实现列表,那肯定是救命稻草。
-
这也是我一直好奇的事情。该行为已记录在案,但在 docs.python.org/3/reference/compound_stmts.html#for 处没有得到证明。可能只是出于 *handwave* 性能原因?或者从一个角度来看是一种保守的选择——允许操作是因为它可以被允许,而在 3.6 之前的 dicts 上它是没有意义的,因为它们是无序的。
-
我可以想到在迭代列表时想要添加到列表的情况,有点像队列。
-
查看dict source code 对键进行迭代似乎并不简单,就像根本。
-
这也可能与订单有关。如果您在迭代列表时附加到列表,则很清楚插入的项目的去向以及迭代的时间。标准字典没有顺序。
标签: python list loops dictionary iteration