On Oct 19, 2005, at 8:16 PM, KraftDiner wrote:
I have a list, and within it, objects are marked for deletion.
However when I iterate through the list to remove objects
not all the marked objects are deleted..
here is a code portion:
i = 0
for obj in self.objList:
if obj.mouseHit:
print 'delete + ' + `i`
self.objList.pop(i)
flag = True
else:
i = i + 1
print `i`
You're mixing two different ways of looping, and they're getting out
of sync.
'for obj in self.objList' will keep right on iterating through the
list even if you don't increment i.
A direct adaptation of your code that should work is:
i = 0
while i < len(self.objList):
if self.objList[i].mouseHit:
self.objList.pop(i)
flag = True
else:
i += 1
Or, shorter and a bit more Pythonic, but not in-place:
newObjList = [obj for obj in self.objList if not obj.mouseHit]
flag = (len(newObjList) != len(self.objList))
self.objList = newObjList
I don't know how the performance of the two would compare. The second
involves creating a new list, but Python is supposed to optimize the
heck out of list comprehension, and removing items from a list in
place isn't free, either.
Jason