Pythonで中身をpopで削除したいなーと思った時、なぜか「dictionary changed size during iteration」とのメッセージが。これは意外と出てきたら原因がパッとしないので、2度と同じことを起こさないように記録しておきます。
直感的にイテレーションしてpopしていく
ここでは、直感的に初心者が思いつきそうな感じのイテレーションを用いてループを回し、popで辞書を消していきます。
dictionary = {
'a': 0,
'b': 1,
'c': 2,
}
for key in dictionary.keys():
dictionary.pop(key)
結果はこんな感じに...
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
RuntimeError: dictionary changed size during iteration
は?RuntimeErrorだと...!?
イテレーション中に辞書のサイズ変わったんですけどと怒られたわけです。
ということは、keys()を使っていながら、ループの内部で辞書をいじってはいけないということになりますね。
keys()をリストとして先に確保してしまえ!!
さて、解決していきます。
イテレーション中の辞書を書き換えてはいけなかったので、*list()*にしてしまお〜〜
ということで、キーのイテレータは配列として別物と扱わせます。
少しだけ変えた奴が下。
dictionary = {
'a': 0,
'b': 1,
'c': 2,
}
for key in list(dictionary.keys()): <=変えるのはここ
dictionary.pop(key)
これで、出力も足してみます。
print(a)
結果が以下になります。
1
お〜動きましたね。
というわけで、辞書型でイテレーションを用いて何かするときは、配列とかで切り離して使ってあげるとエラーなくコードが動きますよ〜
今後は僕も気をつけたいと思います。