From: Kevin M. <kev...@er...> - 2001-09-14 09:16:24
|
Thanks for all the tips! I feel very eco-friendly reusing my objects. /Kevin On Wed, 12 Sep 2001, Ype Kingma wrote: > >Hi, > > > >why does the following not work: > > > >a = [1, 2] > >for i in a: > > a.remove(i) > > > > > >The loop exits after the first iteration leaving a = [2] > > > >How do I get around this problem? > > Iterating over a list that is being modified results > in undefined behaviour. A better way is: > > for i in a[:]: # iterate over a copy > a.remove(i) # remove from original > > The problem with this is that it still needs to access each element > in the list (at least twice). > > When you need to remove some of the elements in a list you could > also use list comprehensions, but these always create a new list: > > a = [i for i in a if not someRemoveCondition(i)] > > > To empty a list in a single operation you can also: > > a[:] = [] # modify in place to become an empty list. (A) > > or > > a = [] # change to refer to a new empty list object. (B) > > or, preferably: > > del a[:] # modify in place deleting all entries (C) > > The last variant does not create a new object, which can make a measurable > difference for garbage collection in case it avoids creating a lot of them. > This technique is also known as reusing existing objects. > I have never measured the difference between (A) and the other > two, but (C) is definitely faster than (B) in Jython. > It is probably faster in CPython, too. > > > > >Any help appreciated, > >Kevin > > My pleasure, > Ype > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users > _________________________________________________ Name/Title : Kevin McNamee, Software Consultant Phone : +46 13 32 1165 |