Python リスト: 反復中の項目削除の落とし穴
項目を同時に削除しながら Python リストを反復処理すると、予期しない動作が発生する可能性があります。注目に値する例は次のとおりです。
<code class="python">letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] for i in letters: letters.remove(i)</code>
不可解なことに、文字の最後の印刷により、1 つおきのアイテムだけが削除されたことがわかります。
異常の理由
この動作は、Python が反復中に iterable への変更を処理する方法に起因します。ドキュメントには、反復されるシーケンスの変更は、特にリストのような可変型の場合、一般に安全ではないことが明示されています。
これを実行すると、将来の Python ビルドで未定義の動作や潜在的な変更が発生する可能性があります。
すべての項目を削除する正しい方法
リストからすべての項目を安全に削除するには、次のいずれかの方法を使用します:
条件付き項目削除の処理
項目を条件付きで削除するには、 [:] スライス構文を使用してリストを作成します:
<code class="python">commands = ["ls", "cd", "rm -rf /"] for cmd in commands[:]: if "rm " in cmd: commands.remove(cmd)</code>
または、フィルター関数を使用して不要な項目を除外します:
<code class="python">commands = [cmd for cmd in commands if not is_malicious(cmd)]</code>
以上がPython リストを反復処理するときに項目の削除を避けるべきなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。