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

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

Patricia Arquette
リリース: 2024-12-04 18:11:12
オリジナル
985 人が閲覧しました

Why Does Removing Elements from a Python List During Iteration 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, 4, 6, 8] ではなく、[0, 2, 3, 5, 6, 8, 9] を出力します。

反復的な削除について理解するBehavior

この出力は、Python が反復中に可変シーケンスを処理する方法から生じます。 Remove が呼び出されると、基になるリストが変更されます。ただし、反復子は同じままで、変更されたリストの走査を続けます。

以下の図は、削除プロセスを示しています。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]       <-  b = 0; remove? no
 ^
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]       <-  b = 1; remove? yes
    ^
[0, 2, 3, 4, 5, 6, 7, 8, 9]          <-  b = 3; remove? no
       ^
[0, 2, 3, 4, 5, 6, 7, 8, 9]          <-  b = 4; remove? yes
          ^
[0, 2, 3, 5, 6, 7, 8, 9]             <-  b = 6; remove? no
             ^
[0, 2, 3, 5, 6, 7, 8, 9]             <-  b = 7; remove? yes
                ^
[0, 2, 3, 5, 6, 8, 9]                <-  b = 9; remove? no
                   ^
ログイン後にコピー

残りの質問への対処

  1. エラー表示: Python は実行時のオーバーヘッドが発生するため、エラーをスローします。プログラマーが反復中にリストを変更した結果を知っており、それに応じて処理することを前提としています。
  2. 歴史的な動作: この動作は、Python の初期バージョン (少なくとも 1.4) から存在しています。これは、可変シーケンスの一般的な実装方法と一致しています。

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

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