ボーエン元のリンク:https://www.cnblogs.com/baihualin/p/10698651.html
リスト内の要素を削除するとき、正シーケンストラバーサルサイクルを使用しないでください、抗順トラバーサルを使用してください!
ADO、最初のケースコード:
DEF試験(データ): 私のデータの: data.remove(I) 戻りデータ データ= [1、2、3] プリント(テスト(データ))
コードの顔が上記、一見、それは真実ではない、それは削除されたデータ要素として機能するための試験のように、空のリストをプリントアウトするだろうと思った、次のように実際に出力されます。
[2]
なぜこのような結果をしませんか?のは、どのような深さを分析してみましょう:
元のリストのメモリです。
data.remove(I)が削除され、「1」の第1の要素を介して初めて、リストは次のようになります。
(i)をdata.removeする第二を行う場合、私は、すなわち、第二の要素である '3「3」を削除し、その後、リストは次のようになります。
第三の要素のリストは、すなわち、[2]に戻すのループのうち、無有します。
どのようにこの問題を解決するには?私たちは、削除された逆の方法を使用することができます!
直接コードに:
DEF試験(データ): 私のデータの[:: - 1]: data.remove(I) 戻りデータ データ= [1、2、3] プリント(テスト(データ))
この時点の実行では、出力は空のリストを発見されました
[]
逆の原理を削除し、次のとおりです。
元のリストのメモリです。
data.remove(I)を介して初めて削除「から3」の最後から二番目の元素であり、リストは次のようになります。
また、第2実行data.remove(I)I、すなわち、最後から二番目の要素である「2」「2」が削除、その後、リストは次のようになります。
data.remove(I)への3回目の実行は、私は三要素の逆数であるとき、すなわち「1」は、「1」が削除され、リストが空リストになり、!
概要:要素のリストで削除正のシーケンス、要素の削除の背後にある値は、前方上部と、削除漏れにつながります。逆の要素を削除すると、前部要素の値がリーンバックを削除しません、すべての要素の完全なリストをトラバースすることが可能です。