Python 2.7视图,for / in和修改是否可以很好地协同工作?

问题描述 投票:4回答:1

Python文档提供有关在迭代时尝试修改dict的警告。这适用于观点吗?

我理解视图是“实时”的,因为如果您更改底层字典,视图会自动反映更改。我也知道如果添加或删除元素,dict的自然顺序可能会改变。这与for / in一起如何工作?你可以安全地修改字典而不会弄乱循环吗?

d = dict()
# assume populated dict
for k in d.viewkeys():
    # possibly add or del element of d

for / in循环是否也遍历所有新元素?它是否会错过元素(因为订单更改)?

python python-2.7 dictionary concurrentmodification dictview
1个回答
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

即使在值视图上进行迭代,您也可以更改值,因为字典的大小不会随之更改,并且键保持相同的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.