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/

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to