On Feb 20, 8:12 am, "ssd" <c...@d.com> wrote: > Hi, > > In the following code, (in Python 2.5) > I was expecting to get in "b" variable the values b: [[0, 0], [0, 1],[0, > 2], [0, 3],[0, 4], [1, 0],[1, 1], [1, 2], .....] > But I get only the last value [4,4], b: b: [[4, 4], [4, 4], [4, 4], ... ] > > My code: > > a = ["",""] > b = [] > > for i in range (0,5): > for j in range (0,5): > a[0] = i > a[1] = j > print "a: " + str(a) > b.append(a) > > print "b: " + str(b) > > what is worng in the code? > > Thanks, > Bye,
The problem is that `a' is the name of a list object. When you change the contents of that list object you are simply mutating that object. You then append that list object to list `b'. But, you aren't creating a new list, you are simply mutating the same list object over and over and appending it to list `b'. So list `b' contains 5 references to the same object. A couple of things I would do differently. There is no reason to declare `a' outside of the loop. This isn't C you don't have to declare your variables before they are needed. `range(0, 5)' is usually just written `range(5)'. Also, check out `xrange'. Here are a couple of examples of alternatives: construct new lists and append them in the inner loop: b = [] for i in range(5): for j in range(5): b.append([i, j]) print b check out list comprehension: b = [[i, j] for i in range(5) for j in range(5)] print b Matt -- http://mail.python.org/mailman/listinfo/python-list