a trick with lists ?

Tim Chase python.list at tim.thechases.com
Thu Feb 7 16:42:58 EST 2008


>>>     self.tasks[:] = tasks
>>>
>>> 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 ?
>>
>> It changes the list in-place. If it has been given to other objects, it 
>> might require that.
> 
> Nowadays it's stylistically better to write
> 
>      self.tasks = list(tasks)
> 
> as it does just the same and makes it a little clearer what's going on 

Um...except it's not "just the same"?

   class Foo(object):
     def __init__(self, tasks):
       self.tasks1 = tasks
       self.todo1 = [self.tasks1, 42]
       self.tasks2 = tasks
       self.todo2 = [self.tasks2, 42]
     def new_tasks1(self, tasks):
       self.tasks1 = list(tasks)
     def new_tasks2(self, tasks):
       self.tasks2[:] = list(tasks)
     def __str__(self):
       return "%r\n%r" % (self.todo1, self.todo2)

   f = Foo([1,2,3])

   f.new_tasks1([4,5,6])
   print 'task1'
   print f # todo1/2 haven't been changed

   print 'task2'
   f.new_tasks2([4,5,6])
   print f # both todo 1 & 2 have been changed

Assignment to a name just rebinds that name.  Assignment to a 
slice of a list replaces the contents in-place.

-tkc






More information about the Python-list mailing list