初心者がpythonループシーケンスで隣接する要素を同時に削除するときの誤りやすい点
814 ワード
(1)問題のケース
リストリストを例に
次に、次のコードのような条件を満たすかどうかを判断するリストがあります.
デルの理想的な実行結果は、次のとおりです.
[11,44,55,66]
しかし、実際の実行結果は次のとおりです.
[11,33,44,55,66]
(2)問題の原因
33削除されていません!これはforのカーソルが22に移動すると22が条件を満たして削除されることを発見し、22を削除すると、後ろの33が22が削除されたことを発見して空の位置を残して自動的に元の22の位置に移動したが、カーソルは無視され、カーソルはこの位置を管理せず、直接次の44にジャンプしたからである.
これが33が削除されていない理由です.
これは非常に危険なバグで、実際の開発では、削除すべきだが漏れたゴミがメモリオーバーフローになるまで蓄積されています.
(3)実行可能なソリューション
私の解決策は、1回の遍歴で削除するのではなく、削除すべきでない要素を中間変数に保存することです.
以上OK!
リストリストを例に
次に、次のコードのような条件を満たすかどうかを判断するリストがあります.
test = [11,22,33,44,55,66]
for temp in test:
if temp == 22 or temp == 33:
test.remove(temp)
デルの理想的な実行結果は、次のとおりです.
[11,44,55,66]
しかし、実際の実行結果は次のとおりです.
[11,33,44,55,66]
(2)問題の原因
33削除されていません!これはforのカーソルが22に移動すると22が条件を満たして削除されることを発見し、22を削除すると、後ろの33が22が削除されたことを発見して空の位置を残して自動的に元の22の位置に移動したが、カーソルは無視され、カーソルはこの位置を管理せず、直接次の44にジャンプしたからである.
これが33が削除されていない理由です.
これは非常に危険なバグで、実際の開発では、削除すべきだが漏れたゴミがメモリオーバーフローになるまで蓄積されています.
(3)実行可能なソリューション
私の解決策は、1回の遍歴で削除するのではなく、削除すべきでない要素を中間変数に保存することです.
test = [11,22,33,44,55,66]
dataBackup = []
for temp in test:
if temp != 22 and temp != 33:
dataBackup.append(temp)
test = dataBackup
以上OK!