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

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

Barbara Streisand
リリース: 2024-12-27 18:36:11
オリジナル
939 人が閲覧しました

Why Does Modifying a Python List During Iteration Lead to Unexpected Results?

Python での反復リスト変更: 結果を理解する

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

numbers = list(range(1, 50))

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

print(numbers)
ログイン後にコピー

意図したように 20 未満の数値を削除する代わりに、このコードは 20 未満の数値がすべて欠落しているリストと 20 自体を出力します。

問題: Iterator Position Shift

この問題は、リストから項目を削除すると、後続の項目の位置が移動するという事実に起因します。ループが進行するにつれて、削除された要素によってリストに「穴」ができるため、チェックされる項目は予期したものではなくなります。

たとえば、最初の反復では 1 が削除されますが、次の反復では2 をチェックしません。リストが短縮されているため、代わりに 3 がチェックされます。この動作が継続し、不正確な出力が発生します。

適切なリスト変更テクニック

この問題を回避するには、反復中にリストを変更する別の方法を使用します。

  • リスト内包表記:
numbers = [n for n in numbers if n >= 20]
ログイン後にコピー
  • インプレース変更:
numbers[:] = (n for n in numbers if n >= 20)
ログイン後にコピー
  • 列挙:
for i, n in enumerate(numbers):
    if n < 20:
        numbers[i] = None
numbers = [n for n in numbers if n is not None]
ログイン後にコピー

これらの手法は、反復中にリストの長さを変更しません。 、アイテムの正しい処理と目的の出力が保証されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート