RuntimeError: OrderedDict mutated during iteration


RuntimeError: OrderedDict mutated during iteration
Traceback (most recent call last):
  File "/home/yongqiang/pytorch_work/end2end-asr-pytorch-example/yongqiang.py", line 18, in 
    for key, value in dict_data.items():
RuntimeError: OrderedDict mutated during iteration

1. RuntimeError: OrderedDict mutated during iteration
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yongqiang cheng

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from collections import OrderedDict

dict_data = OrderedDict()
dict_data['1'] = "cheng"
dict_data['2'] = "yong"
dict_data['3'] = "qiang"
dict_data['4'] = "forever"
dict_data['5'] = "strong"

for key, value in dict_data.items():
    print(key + ': ' + value)

    if ('3' == key):
        del dict_data[key]

/home/yongqiang/miniconda3/envs/pt-1.4_py-3.6/bin/python /home/yongqiang/pytorch_work/end2end-asr-pytorch-example/yongqiang.py
Traceback (most recent call last):
  File "/home/yongqiang/pytorch_work/end2end-asr-pytorch-example/yongqiang.py", line 18, in 
    for key, value in dict_data.items():
RuntimeError: OrderedDict mutated during iteration
1: cheng
2: yong
3: qiang

Process finished with exit code 1

2. The issue is that dict_data.items() does not return a copy, so it should not be modified while iterating.
Pythonの付与文は、オブジェクトをコピーするのではなく、ターゲットとオブジェクトの間にバインド関係を作成します.開発者は、自身が可変または可変項目を含む集合オブジェクトに対して、操作を変更するためにそのコピーを生成し、元のオブジェクトを変更しないようにする必要がある場合があります.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yongqiang cheng

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from collections import OrderedDict

dict_data = OrderedDict()
dict_data['1'] = "cheng"
dict_data['2'] = "yong"
dict_data['3'] = "qiang"
dict_data['4'] = "forever"
dict_data['5'] = "strong"

for key, value in list(dict_data.items()):
    print(key + ': ' + value)

    if ('3' == key):
        del dict_data[key]

print()

for key, value in list(dict_data.items()):
    print(key + ': ' + value)

/home/yongqiang/miniconda3/envs/pt-1.4_py-3.6/bin/python /home/yongqiang/pytorch_work/end2end-asr-pytorch-example/yongqiang.py
1: cheng
2: yong
3: qiang
4: forever
5: strong

1: cheng
2: yong
4: forever
5: strong

Process finished with exit code 0