新人エンジニアが書いたコードでバグが発生していました。
下記のようなプログラムでした。
リストから「2」がすべて消えることを期待していました。「2」は5個あります。
test_list = [1, 2, 1, 3, 4, 2, 1, 3, 3, 2, 2, 2, 3, 1]
print('要素数:' + str(len(test_list)))
for ele in test_list:
if ele == 2:
test_list.remove(ele)
print('要素数:' + str(len(test_list)))
print(test_list)
しかし実行結果↓
要素数:14
要素数:10
[1, 1, 3, 4, 1, 3, 3, 2, 3, 1]
test_list.remove(ele)を実行するとi番目の要素が削除されるので、i+1番目以降の要素は1つずつ前にずれます。removeによって要素数=for文の回数に影響が与えられ、上記の場合、10回しか回っていません。
「2」(=削除対象値)がひとつだけの場合や、「2」が複数個あっても連続していなければ全ての「2」がremoveされます。しかし、データ内容に依存するようなプログラムはバグの温床になり、適切とは言えません。
別途リストを初期化し、削除対象外の要素をそちらにappendしていく対応が良いでしょう。
【補足】
Javaのリストで拡張forで同じことをやってみたら、java.util.ConcurrentModificationExceptionになりました。それについての詳細はこちらを参照。