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

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

Mary-Kate Olsen
リリース: 2024-12-01 12:34:10
オリジナル
172 人が閲覧しました

Why Does Removing Elements from a Python List During Iteration Lead to Unexpected Results?

Python での反復中のリストの削除について

リストの反復中に、要素を削除することが必要になる場合があります。ただし、削除が正しく処理されない場合、予期しない動作が発生する可能性があります。

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, 8, 9] が、予期される [0, 2, 4, 6, 8] の代わりに返されます。この異常は、Python が反復中に可変オブジェクトを処理する方法が原因で発生します。

問題の視覚的な説明

一連の操作は次のように視覚化できます。

[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
                     ^            
ログイン後にコピー

エラーなし指示

Python は、基礎となる反復子が変更されてもエラーを発行しません。これは、突然変異がいつどのように反復子に影響するかを判断するには広範なランタイム分析が必要となり、実行が大幅に遅くなるからです。

動作の一貫性

この例で説明されている動作は、バージョン間で一貫性を保っています。 Python の機能を利用して、反復中に可変オブジェクトを変更するコードの予測可能な実行を保証します。

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

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