この Python for ステートメントで少し時間を無駄にしました。
class MyListContainer:
def __init__(self):
self.list = []
def purge(self):
for object in self.list:
if (object.my_cond()):
self.list.remove(object)
return self.list
container = MyListContainer()
# now suppose both obj.my_cond() return True
obj1 = MyCustomObject(par)
obj2 = MyCustomObject(other_par)
container.list = [obj1, obj2]
# returning not an empty list but [obj2]
container.purge()
「パージ」のサイクルがリストの最初のオブジェクトを削除すると、2番目のオブジェクトがリストの先頭に移動してサイクルが終了するため、期待どおりに機能しません。
forサイクルの前にself.listの複製を解決しました:
...
local_list = self.list[:]
for object in local_list:
...
元のリストの長さを変更しているため、 for ステートメントが機能しなくなったと思います。誰かがこの点を明確にすることができますか?
そして、この問題を解決するためのより「エレガントな」方法はありますか? リスト内に複数の要素がある場合、毎回複製するのは得策ではないようです。
おそらくfilter()関数が正しい関数ですが、もしあれば他のアプローチが必要です。
私は初心者です。
あなたの有用な答えを要約するには:
- ループしているリストを編集しないでください
- リストを複製するか、リスト内包表記を使用してください
- リストを複製しても記憶が無駄になることはありません。