1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

for文の中でリストの要素を削除するのは危険

Posted at

新人エンジニアが書いたコードでバグが発生していました。

下記のようなプログラムでした。
リストから「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になりました。それについての詳細はこちらを参照。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?