在i上迭代时修改Python dict

2024-06-10 03:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个Python字典d,我们像这样迭代它:

for k,v in d.iteritems():
    del d[f(k)] # remove some item
    d[g(k)] = v # add a new item

fg只是一些黑盒转换。)

换言之,我们尝试在使用iteritems迭代的同时向d添加/删除项。

这个定义清楚吗?你能提供一些参考资料来支持你的回答吗?

(很明显如果它坏了怎么修复,所以这不是我要找的角度。)


Tags: inaddnewfor字典定义黑盒some
3条回答

你不能这样做,至少在d.iteritems()的情况下。我试过了,但是Python失败了

RuntimeError: dictionary changed size during iteration

如果您改为使用d.items(),则它可以工作。

在Python 3中,d.items()是字典中的一个视图,就像Python 2中的d.iteritems()。要在Python 3中执行此操作,请使用d.copy().items()。这同样允许我们遍历字典的副本,以避免修改我们正在遍历的数据结构。

亚历克斯·马泰利在这件事上说了算。

在容器上循环时更改容器(例如dict)可能不安全。 所以del d[f(k)]可能不安全。如您所知,解决方法是使用d.items()(循环容器的独立副本),而不是d.iteritems()(使用相同的底层容器)。

可以修改dict的现有索引处的值,但在新索引处插入值(例如d[g(k)]=v)可能不起作用。

Python文档页(对于Python 2.7)中明确提到

Using iteritems() while adding or deleting entries in the dictionary may raise a RuntimeError or fail to iterate over all entries.

Python 3也一样。

同样适用于iter(d)d.iterkeys()d.itervalues(),我甚至会说它适用于for k, v in d.items():(我记不清for到底做了什么,但如果实现名为iter(d),我不会感到惊讶)。

相关问题 更多 >