Am 27.09.2010 20:29, schrieb Steven D'Aprano:
On Tue, 28 Sep 2010 03:54:55 am Alex Hall wrote:
Hi again everyone,
I have a 2d array (I guess it is technically a list) which I want to
fill with zeros. Later I will change some values, but any I do not
change have to be zeros. I have two complex for loops, but I tried to
scale things down to a couple list comprehensions and I broke things.
What is wrong with the following line?
self.am=[[(a,b) for a in range(len(self.lines)) a=0] for b in
range(len(self.lines)) b=0]


Start with a single row, of n columns:

[0 for i in range(n)]  # the loop variable i is not used

Now all you need is to set n appropriately:

n = len(self.lines)
[0 for i in range(n)]


Is there an easier way? Yes, you don't even need a list comp:

[0]*n

Now make m rows of the same:

[ [0]*n for i in range(m) ]

And you are done.


You might be tempted to take a short-cut:

[ [0]*n ]*m

but this doesn't work as you expect. This is one of the rare Python
gotchas -- it looks like it should work, but it doesn't behave like you
might expect. Try it and see:

a = [[0]*3]*4
a
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[0][1] = 2
a
[[0, 2, 0], [0, 2, 0], [0, 2, 0], [0, 2, 0]]

What's going on here? It's a little complicated, so let's start with a
simpler situation:

b = [0, 0, 0]
c = b  # c is an alias to the same list as b
d = b  # so is d
e = c  # and e
b[0] = 3
e
[3, 0, 0]

Because both b and e refer to the same list (not copies!) any change to
b *must* also change e. It's like if Barack Obama gets a haircut, so
does the current President of the USA, because they're the same person.

Now stick them in a list:

a = [b, c, d, e]
a
[[3, 0, 0], [3, 0, 0], [3, 0, 0], [3, 0, 0]]
a[0][1] = 4
a
[[3, 4, 0], [3, 4, 0], [3, 4, 0], [3, 4, 0]]

Modify one, modify them all, because in fact they are actually all the
same list.

[ [0]*3 ]*4 behaves the same way. There's no problem in the inner list,
but the outer list doesn't make four copies of [0,0,0], it has *one*
list repeated four times. Modify one, modify them all.


Another extremly helpful explanation for every learner watching the mailing list. Steven, you really deserve the golden tutor medal of honor!

Cheers,

Jan

P.S.: You other guys are awesome as well. Amazing mailing list...
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to