On 03/12/2010 1.32, Steven D'Aprano wrote:
Back in Ancient Days when dinosaurs walked the earth, and I programmed in 
Pascal, computers didn't have much memory, and were slow.
Consequently it wasn't practical to make a copy of a list if you wanted to 
delete a few items. The only practical way to modify
lists was to modify them in place, and if you needed to delete items, you had 
to work backwards. It took me a while to break myself
of the habit of doing this:

for i in range(len(mylist)-1, -1, -1):
     if mylist[i] == "something":
          del mylist[i]

(Note that you only need to work backwards if you're *deleting* entries, not if 
you replace them with something else.)

This is still a useful technique to have in your toolbox, but generally 
speaking the above is better written as:

mylist = [x for x in mylist if x != "something"]
Up to this point, I share experiences and solution. But the next point did 
thrill me:

If you really need to modify the list in place, and not just re-bind the name 
"mylist" to the new list, then one tiny change will do
it:

mylist[:] = [x for x in mylist if x != "something"]

I thought mylist[:] was a copy of mylist, and the two lines above would 
generate exactly the same code!

Is this a special optimization by the Python interpreter, or is it just a 
mistake in my understanding of the slice operator?


-----
Nessun virus nel messaggio.
Controllato da AVG - www.avg.com
Versione: 10.0.1170 / Database dei virus: 426/3313 -  Data di rilascio: 
13/12/2010

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to