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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 06:42:13902ブラウズ

Why Does Removing Elements from a List During Iteration in Python Produce Unexpected Results?

リストの削除中の反復変更について

以下の Python コードは、リストから代替要素を削除することを目的としています。

a = list(range(10))
remove = False
for b in a:
    if remove:
        a.remove(b)
    remove = not remove
print(a)

ただし、予期しない出力 [0, 2, 3, 5, 6, [0、2、4、6、8] の代わりに 8、9] を使用します。これは、反復プロセスの動的な性質に起因します。

出力値が [0, 2, 3, 5, 6, 8, 9]:

である理由ループが a 内の要素を反復処理すると、特定の要素を削除してリストが変更されます。これは基礎となる反復子に影響を与え、出力での削除パターンを説明します。以下に段階的な内訳を示します。

  1. 反復子は a[0] = 0 から始まります。remove は最初は False なので、要素は削除されません。
  2. 反復子は次の位置に移動します。 a[1] = 1。remove が True に設定されているため、a[1] が削除されます。
  3. 反復子は次へ進みます。 a[2] = 2。remove は False になったので、a[2] はリストに残ります。
  4. 反復子は a[3] = 3 に進みます。remove は再び True になったので、a[3] は
  5. これはループが完了するまで代替要素をスキップして続行されます。

エラー メッセージ:

Python はパフォーマンスを優先するため、変更されたイテレータに関するエラーをスローしません。考えられるすべての反復変更を検出して処理すると、大幅なオーバーヘッドが発生します。したがって、Python は、このような状況では、明示的なエラー メッセージよりも実行速度を優先します。

以前の Python バージョンとの一貫性:

ここで説明されている動作は、Python のバージョン全体で一貫しています。 1.4に戻ります。この方法で反復変更を処理するのは、可変シーケンス実装の固有の機能です。

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

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