Sébastien Vincent <sebastien_nimp73 wrote: > I've found some class on the Net which takes basically this form : > > ###### > class Foo: > def __init__(self): > self.tasks = [] > ... > > def method1(self): > tasks = [] > while True: > ... > append/pop elements into/from tasks > ... > if condition : break > > self.tasks[:] = tasks > return > ###### > > What I do not fully understand is the line "self.tasks[:] = tasks". Why does > the guy who coded this did not write it as "self.tasks = tasks"? What is the > use of the "[:]" trick ? >
I've just run into this difference myself. As several others have pointed out, assignment to self.task[:] modifies this list in place. Here my example showing a striking difference class MyClass(object) : def shorten_list(self,outer_list) : ll=len(outer_list) if ll > 0 : outer_list[:]= outer_list[:ll-1] mylist=[1,2,3] MyClass().shorten_list(mylist) print mylist // this prints [1, 2] (as expected) class MyClass2(object) : def shorten_list(self,outer_list) : ll=len(outer_list) if ll > 0 : outer_list= outer_list[:ll-1] mylist=[1,2,3] MyClass2().shorten_list(mylist) print mylist # this prints [1, 2, 3] The shortened list outer_list[:ll-1] has been assigned (bound in Python terms) to the LOCAL reference (to a list) 'outer_list' -- Helmut Jarausch Lehrstuhl fuer Numerische Mathematik RWTH - Aachen University D 52056 Aachen, Germany -- http://mail.python.org/mailman/listinfo/python-list