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 サイトの他の関連記事を参照してください。