a trick with lists ?

Steve Holden steve at holdenweb.com
Thu Feb 7 17:52:49 EST 2008


Tim Chase wrote:
>>>>     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.
> 
[sigh] Right, I got the assignment the wrong way around (and clearly you 
can't put list(tasks) on the left-hand side of an assignment).

Of course

     self.tasks = list(tasks)

is equivalent to

     self.tasks = tasks[:]

Thanks for pointing out my error.

regards
  Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list