読者です 読者をやめる 読者になる 読者になる

辞書をイテレートしながら変更すると危ない

#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


リストなど、他の変更可能オブジェクトでも同じだと思われます。

広告を非表示にする