2024-06-10 03:35:52 发布
网友
假设我们有一个Python字典d,我们像这样迭代它:
d
for k,v in d.iteritems(): del d[f(k)] # remove some item d[g(k)] = v # add a new item
(f和g只是一些黑盒转换。)
f
g
换言之,我们尝试在使用iteritems迭代的同时向d添加/删除项。
iteritems
这个定义清楚吗?你能提供一些参考资料来支持你的回答吗?
(很明显如果它坏了怎么修复,所以这不是我要找的角度。)
你不能这样做,至少在d.iteritems()的情况下。我试过了,但是Python失败了
d.iteritems()
RuntimeError: dictionary changed size during iteration
如果您改为使用d.items(),则它可以工作。
d.items()
在Python 3中,d.items()是字典中的一个视图,就像Python 2中的d.iteritems()。要在Python 3中执行此操作,请使用d.copy().items()。这同样允许我们遍历字典的副本,以避免修改我们正在遍历的数据结构。
d.copy().items()
亚历克斯·马泰利在这件事上说了算。
在容器上循环时更改容器(例如dict)可能不安全。 所以del d[f(k)]可能不安全。如您所知,解决方法是使用d.items()(循环容器的独立副本),而不是d.iteritems()(使用相同的底层容器)。
del d[f(k)]
可以修改dict的现有索引处的值,但在新索引处插入值(例如d[g(k)]=v)可能不起作用。
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.
iteritems()
RuntimeError
对Python 3也一样。
同样适用于iter(d)、d.iterkeys()和d.itervalues(),我甚至会说它适用于for k, v in d.items():(我记不清for到底做了什么,但如果实现名为iter(d),我不会感到惊讶)。
iter(d)
d.iterkeys()
d.itervalues()
for k, v in d.items():
for
你不能这样做,至少在
d.iteritems()
的情况下。我试过了,但是Python失败了如果您改为使用
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)中明确提到
对Python 3也一样。
同样适用于
iter(d)
、d.iterkeys()
和d.itervalues()
,我甚至会说它适用于for k, v in d.items():
(我记不清for
到底做了什么,但如果实现名为iter(d)
,我不会感到惊讶)。相关问题 更多 >
编程相关推荐