ホームページ  >  記事  >  バックエンド開発  >  反復中にリストを変更すると予期せぬ動作が発生する原因は何ですか?

反復中にリストを変更すると予期せぬ動作が発生する原因は何ですか?

DDD
DDDオリジナル
2024-10-21 09:02:02205ブラウズ

What Causes Unexpected Behavior When Modifying Lists While Iterating?

Python のリスト反復動作を理解する

Python リストを使用する場合、予期しない結果を避けるために反復がどのように動作するかを認識することが重要です。よくある落とし穴の 1 つは、リストを反復処理するときにリストを変更するときに発生します。次のコードを考えてみましょう:

x = [1,2,2,2,2]

for i in x:
    x.remove(i)

print(x)  

予想に反して、このコードはリストからすべての要素を削除できません。代わりに、2 つの要素が残されます。その理由を理解するために、リストの反復中の操作の順序を詳しく見てみましょう。

リストの変更による反復順序

Python の for ループは、リストを要素ごとに反復します。ループ内の要素を削除してリストを変更すると、リストの長さが変わります。これは、ループ反復子が前方に進むときに、元のシーケンス内の次の要素がスキップされることを意味します。

この例では、最初の反復で x から要素 1 が削除されると、リストの長さが減分されます。これにより、元のシーケンス内の次の要素 2 がスキップされます。ループが続くと、同様のスキップが発生し、2 と別の要素が削除されずに残ります。

問題の解決

この動作を回避するには、元のリストを変更しないようにしてください。繰り返します。代わりに、以下に示すように、リストのコピーを作成して反復処理することを検討してください。

for i in x[:]:
    x.remove(i)

構文 x[:] は、すべての要素を含む x の「スライス」を作成し、事実上コピーを作成します。このコピーを反復処理することで、元のリストから要素をスキップすることなく安全に削除できます。

以上が反復中にリストを変更すると予期せぬ動作が発生する原因は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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