> >>> myls=range(50)
> >>> for i in myls:
> print i
> if i==20:
> myls.insert(5,5)
> 
> The point is, the list(both size and elements) is
> changing even as it is being operated upon.

You are quite right it is, in general a bad idea to alter 
the thing you are iterating over.

> This particular case goes into infinite loop at i=20.

For obvious reasons: you insert something before 20 which 
moves up one position, the next element in the list is 
now 20 again.

Better to use a while loop over the indices if you must 
do this kind of thing, then increment the index as well 
as insert the item.

myls = range(50)
index = 0
while index < len(myls):
   print myls[index]
   if myls[index] == 20:
      myls.insert(5,5)
      index += 1
   index += 1

But if the changes are being made outside your loop (eg by 
another thread - dangerous practice anyway!) you need the 
linked list approach and you also need to treat our list 
as a protected resource in your threads. ie lock it before 
using otherwise you may wind up deleting the thing you are 
working on!

HTH,

Alan G.
_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to