次の記事では、Python3 で for ループを使用してリスト内の要素を削除する場合の落とし穴について詳しく説明します。これは非常に参考になるので、皆さんのお役に立てれば幸いです。一緒に見てみましょう
for ループステートメントのオブジェクトは反復可能オブジェクトです。反復可能オブジェクトは __iter__ または iter メソッドを実装し、反復子を返す必要があります。イテレータは __next__ または next メソッドを実装するだけで済みます。
次に、リストが反復をサポートする理由を確認してみましょう:
x = [1,2,3] its = iter(x) # its = x.__iter__() print(type(its)) # print(its.__next__()) # print(its.__next__()) # print(its.__next__()) print(next(its)) print(next(its)) print(next(its))
結果: for ステートメントはどのようにループしますか?手順は次のとおりです:
(1) まず、オブジェクトが反復可能オブジェクトであるかどうかを判断します。そうでない場合は、エラーを直接報告し、そうである場合は、__iter__ または iter メソッドを呼び出して反復子
( 2) 続行 イテレータの __next__ または next メソッドを呼び出し、毎回順番にイテレータ内の値を返す
<class 'list_iterator'>
1
2
3
list1 = [1,2,3,4,5,6] for i in list1: if i == 2: list1.remove(i) print(i) print(list1)
2番目の出力の結果は、明らかに要素2が含まれるリストです。が削除されましたが、最初の print に 3 がないのは、for ステートメントを実行するときに、最初にイテレータが生成され、次に next メソッドが使用されてイテレータ内の値が順番に返されるためです。リストから削除されると、要素 3 のインデックスが元の要素になります。インデックス 2 は、要素 3 を要素 2 の位置に押し出すため、次のメソッドは値 3 を返しません。Python では、iter 関数を使用できます。順序付けされた集約型のイテレータを取得するには、イテレータを次のポインタを持つ一方向のリンクリストがあるイテレータとして理解しています。ヘッダーの内容は空です。次のポインタは、順序付けされた集計タイプの最初の要素を指します。 リンクされたリストの最後の要素の次のポインターにアクセスすると、Python は StopIteration エラーを報告します。
関連する推奨事項: Python リストから要素を削除するときに注意すべき落とし穴
以上がPython3 で for ループを使用してリスト内の要素を削除する際の落とし穴の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。