ホームページ >バックエンド開発 >Python チュートリアル >反復中にリストを変更すると予期しない結果が生じるのはなぜですか?

反復中にリストを変更すると予期しない結果が生じるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-23 19:53:17795ブラウズ

Why Does Modifying a List During Iteration Produce Unexpected Results?

反復中にリストを変更すると予期しない結果が発生する

反復中にリストを変更すると、予期しない結果が発生する可能性があります。次のコードを考えてみましょう:

numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)

リストから 20 未満の数値を削除するつもりにもかかわらず、結果の出力にはこれらの数値の一部が含まれています。この矛盾は、反復中にリストが変更されるために発生します。

具体的には、20 (1) 未満の最初の数値を削除した後、ループは元のリストの次の項目 (現在は 2 ではなく 3) に進みます。このプロセスが続行され、20 未満の奇数がすべて削除されます。

この問題を回避するには、リストなどの別のアプローチを使用することをお勧めします。内包表記またはジェネレーター式。リスト内包表記を使用した例を次に示します。

numbers = [n for n in numbers if n >= 20]

このコードは、不要な要素をフィルターで除外しながら、リストの元の順序を保持します。あるいは、ジェネレータ式を使用してインプレース変更を使用することもできます。

numbers[:] = (n for n in numbers if n >= 20)

要素を削除する前に要素に対して操作を実行する必要がある場合は、インデックス付きループを使用し、要素を None に設定することを検討してください。次に、None 以外の要素のみを含む新しいリストを作成します:

for i, n in enumerate(numbers):
    if n < 20:
        print("do something")
        numbers[i] = None
numbers = [n for n in numbers if n is not None]

以上が反復中にリストを変更すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。