Python の反復の異常: リスト変更時に要素をスキップする
Python でループを使用してリストを走査する場合、潜在的な可能性を認識することが重要です反復中にリストを変更することで発生する可能性のある異常。このような異常の 1 つは、ループ内のリストから要素が削除されたときに発生します。
次の例を考えてみましょう:
<code class="python">x = [1, 2, 2, 2, 2] for i in x: x.remove(i) print(x) # Expected: [] but instead results in [2, 2]</code>
不可解なことに、このループを実行した後も、リスト x にはまだ 2 つの要素が含まれています ( [2, 2]) 意図したように空ではなく。この動作は、Python がリストの反復を処理する方法に起因します。
反復メカニズム
for ループがリストを反復するとき、リストを指す内部ポインターが維持されます。現在検査中の要素。ただし、要素がリストから削除された場合、ポインタは次の要素を参照するように自動的に更新されません。その結果、ループは、削除された要素に続く要素をスキップします。
スキップされた要素の回避
要素のスキップを防ぐために、リストの変更は、元のリストのコピー。次の変更されたコードでは、スライスを使用してリストのコピーを作成し、それを反復処理します。
<code class="python">for i in x[:]: x.remove(i)</code>
スライス操作 x[:] は、x のすべての要素を含む新しいリストを作成します。このコピーは反復に使用され、削除後に内部ポインターが次の要素に正しく更新されるようにします。結果として、ループはリストからすべての要素を正常に削除します。
以上がPython での反復中にリストの変更により要素がスキップされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。