ホームページ > バックエンド開発 > Python チュートリアル > Python リストを反復処理するときに項目の削除を避けるべきなのはなぜですか?

Python リストを反復処理するときに項目の削除を避けるべきなのはなぜですか?

Barbara Streisand
リリース: 2024-10-19 11:16:29
オリジナル
691 人が閲覧しました

When Iterating Through a Python List, Why Should You Avoid Removing Items?

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 ビルドで未定義の動作や潜在的な変更が発生する可能性があります。

すべての項目を削除する正しい方法

リストからすべての項目を安全に削除するには、次のいずれかの方法を使用します:

  • 文字を削除[:]してすべてを削除します。要素とリスト オブジェクトへの参照。
  • letters[:] = []。元のオブジェクトへの参照はそのままにして、新しい空のリストを既存の変数に割り当てます。
  • letters = []新しい空のリストを作成し、それを新しい変数に割り当てます。

条件付き項目削除の処理

項目を条件付きで削除するには、 [:] スライス構文を使用してリストを作成します:

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

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