On Thu, Jun 18, 2009 at 6:21 AM, karma<dorjeta...@googlemail.com> wrote: > Hi All, > > I'm trying to write a function that flattens a list. However after I > call the function more than once, it appends the result (a list) from > the second call with the first. I can get around it by either setting > the list to an empty one before calling the function, but I would like > to keep it in the function, another alternative I found was to pass an > empty list as an argument. > > Can someone explain how python keeps track of variables within > functions (I was expecting the variable to be destroyed after a value > was returned). Also what is a better way to handle this?
Default arguments are only evaluated once, when the function is compiled, so the start list is shared between invocations of flatten. This is a FAQ: http://effbot.org/pyfaq/why-are-default-values-shared-between-objects.htm Another solution - it's easy to rewrite flatten() so it doesnt' need a default argument: In [1]: def flatten(myList): ...: start = [] ...: for i in myList: ...: if type(i) != list: ...: start.append(i) ...: else: ...: start.extend(flatten(i)) ...: return start Kent PS Please don't quote unrelated questions when posting. > Thanks > > >>>> def flatten(myList,start=[]): > """ Flatten nested lists > >>> flatten([1,[2,[3,4],5]],[]) > [1, 2, 3, 4, 5] > """ > for i in myList: > if type(i) != list: > start.append(i) > else: flatten(i,start) > return start > > >>>> flatten([1,[2,[3,4],5]]) > [1, 2, 3, 4, 5] > >>>> flatten([1,[2,[3,4],5]]) > [1, 2, 3, 4, 5, 1, 2, 3, 4, 5] > >>>> flatten([1,[2,[3,4],5]],[]) > [1, 2, 3, 4, 5] _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor