4

Документы Python предоставляют предупреждения о попытке изменить dict во время итерации по нему. Это относится к представлениям?Делают ли представления Python 2.7, для/in и модификации, вместе?

Я понимаю, что взгляды являются «живыми» в том смысле, что если вы измените базовый dict, вид автоматически отражает изменение. Я также знаю, что естественный порядок dict может измениться, если элементы добавлены или удалены. Как это работает в сочетании с for/in? Можете ли вы безопасно изменить диктовку, не испортив петлю?

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

Выполняет ли цикл for/in все новые элементы? Пропускает ли он элементы (из-за изменения порядка)?

+4

Вы попробовали сами? –

+0

'iter (d)', 'd.iterkeys()' и 'iter (d.viewkeys())' все эквивалентны. –

ответ

7

Да, это относится к словарным представлениям по любым клавишам или элементам, так как они обеспечивают вид содержания словаря live. You не может добавлять или удалять ключи в словаре при повторении по словарю, потому что, как вы говорите, это изменяет порядок словаря.

Demo, чтобы показать, что это действительно так:

>>> 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 

Вы можете изменять значения, даже если итерация вид на ценности, так как размер словаря не будет меняться, и ключи остаются в том же порядке.

+0

У меня нет ошибки при использовании 'del'. Не могли бы вы расширить свой ответ на адрес? – Ouroborus

+0

@Ouroborus: Я получаю такую ​​ошибку. –

+1

@Ouroborus: также обратите внимание, что в Python 2 функции 'dict.keys()', 'dict.items()' и 'dict.values ​​()' создают новый объект списка с этими ключами и/или значениями в set order * first *, поэтому изменение словаря в цикле не повлияет на эти списки. Это не вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^