On 2008-05-15, Gabriel <[EMAIL PROTECTED]> wrote: > Hi all > > Just wondering if someone could clarify this behaviour for me, please? > >>>> tasks = [[]]*6 >>>> tasks > [[], [], [], [], [], []] >>>> tasks[0].append(1) >>>> tasks > [[1], [1], [1], [1], [1], [1]] > > Well what I was expecting to end up with was something like: > ?>>> tasks > [[1], [], [], [], [], []] > > > I got this example from page 38 of Beginning Python.
This is a more complicated case of a = [] b = a a.append(1) print b # Will print "[1]" This is the case, because both a and b refer to the same list data-value. In your case, basically what you are doing is a = [] # a is an empty list (introduced for easier explanation) tasks = [a] # tasks is a list with 1 'a' tasks = tasks*6 # you create 5 additional references to 'a' in 'tasks ie tasks is now the equivalent of [a, a, a, a, a, a]. It refers to the same 'a' list 6 times. When you print 'tasks', you actually print the same 'a' value 6 times. in particular, tasks is **NOT** a,b,c,d,e,f = [], [], [], [], [], [] # create 6 different empty list values tasks2 = [a, b, c, d, e, f] although when you print both tasks, you won't see the difference. Next, 'tasks[0]' refers to the first list element, that is, value 'a'. To that list you append an element. In other words, you do "a.append(1)". However, since tasks has 6 references to the same list 'a', all its members appear to be changed (but you are really displaying the same value 6 times). You can query this equality with 'is': print tasks[0] is tasks[1] # will print 'True' print tasks2[0] is tasks2[1] # Will print 'False' Sincerely, Albert -- http://mail.python.org/mailman/listinfo/python-list