Python文档提供有关在迭代时尝试修改dict的警告。这适用于观点吗?
我知道观点是"直播"从某种意义上说,如果您更改底层字典,视图会自动反映更改。我还意识到,如果添加或删除元素,字典的自然顺序可能会发生变化。这与for / in一起如何工作?你可以安全地修改字典而不会弄乱循环吗?
d = dict()
# assume populated dict
for k in d.viewkeys():
# possibly add or del element of d
for / in循环是否也遍历所有新元素?它是否会错过元素(因为订单更改)?
答案 0 :(得分:7)
是的,这适用于关键字或项目的字典视图,因为它们提供字典内容的实时视图。在迭代字典视图时,无法 添加或删除字典中的键,因为正如您所说,这会改变字典顺序。
演示以证明情况确实如此:
>>> d = {'foo': 'bar'}
>>> for key in d.viewkeys():
... d['spam'] = 'eggs'
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>>> d = {'foo': 'bar', 'spam': 'eggs'}
>>> for key in d.viewkeys():
... del d['spam']
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
你可以更改值,即使是在值视图上进行迭代时,因为字典的大小不会随后更改,并且键保持相同的顺序。