辞書をイテレートしながら変更すると危ない
#encoding:shift-jis from __future__ import division, with_statement, print_function # キーを 5 ずつずらそうとする d = dict.fromkeys([1, 3, 5]) for k in d: d[k + 5] = d.pop(k) print(d) # => {16: None, 18: None, 20: None} # !?!?!?!?
printしてみると何が起きているか多少わかる。
#encoding:shift-jis from __future__ import division, with_statement, print_function d = dict.fromkeys([1, 3, 5]) for k in d: print(k) d[k + 5] = d.pop(k) # 1 # 3 # 5 # 6 # 8 # 10 # 11 # 13 # 15 # listでキーをコピーすればOK d = dict.fromkeys([1, 3, 5]) for k in list(d): print(k) d[k + 5] = d.pop(k) # 1 # 3 # 5
リストなど、他の変更可能オブジェクトでも同じだと思われます。