ホームページ  >  記事  >  バックエンド開発  >  Python で反復処理やリストからの削除を行うと予期しない結果が生じる理由

Python で反復処理やリストからの削除を行うと予期しない結果が生じる理由

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-19 09:55:30342ブラウズ

Why Iterating and Removing from a List in Python Can Cause Unexpected Results

反復中にリストから項目を削除する - 典型的なイディオムが失敗する理由

プログラミングでは、リストを反復処理して削除するのが一般的です。必要に応じて項目を選択します。ただし、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)
print(letters)</code>

このコードは、リスト。驚くべきことに、コードの出力は空のリストではなく、元のリストの他のすべての項目が含まれています。

['b', 'd', 'f', 'h', 'j', 'l']

説明

この理由動作は、反復中のリスト変更の Python の処理にあります。ドキュメントには明確に次のように記載されています:

「ループ内で反復されているシーケンスを変更するのは安全ではありません [...] 反復しているリストを変更する必要がある場合は [...] 反復する必要があります"

提供されたコードでは、反復処理中にリストの文字を変更しようとしています。この状況を処理するための Python の設計では、削除するたびに 1 つおきの項目をスキップして反復が続行されます。

コードの書き換え

この問題を回避するには、コードを次のようにする必要があります。リストを反復処理する前にリストのコピーを作成するように書き換えられました。これを実現するには、いくつかの方法があります。

  • del 文字[:]: リストからすべての項目を削除し、事実上空のリストに置き換えます。
  • letters[:] = []: del Letters[:] と似ていますが、元のリストを変更する代わりに、新しい空のリストを生成します。
  • letters = []: 完全に新しい空のリストを変数の文字に割り当てます。

あるいは、条件に基づいて特定の項目を削除することが目的の場合は、filter() 関数を使用して新しいリストを作成する方が効率的です。必要な項目のみを含むリスト。このアプローチにより、元のリストのコピーを反復処理する必要がなくなります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。