Stephen Thorne wrote: >> '>>> a = [i*2*b for i in range(3) for b in range(4)] >> '>>> a >> [0, 0, 0, 0, 0, 2, 4, 6, 0, 4, 8, 12] >> >> Might take you a while to correlate the answer with the loop, but you >> should be able to see after a while that this nesting is the same as >> >> '>>> a = [] >> '>>> for b in range(4): >> '>>> for i in range(3): >> '>>> a.append(i*2*b) > > There is a subtle error in this explanation.
if you run the example, you'll notice that it's not so subtle. read on. > The equivilence actually looks like: > > '> a = [] > '> l1 = range(4) > '> l2 = range(3) > '> for b in l1: > '> for i in l2: > '> a.append(i*2*b) really? def myrange(x): print "RANGE", x return range(x) print [i*2*b for i in myrange(3) for b in myrange(4)] a = [] for b in myrange(4): for i in myrange(3): a.append(i*2*b) print a a = [] l1 = myrange(4) l2 = myrange(3) for b in l1: for i in l2: a.append(i*2*b) print a prints RANGE 3 RANGE 4 RANGE 4 RANGE 4 [0, 0, 0, 0, 0, 2, 4, 6, 0, 4, 8, 12] RANGE 4 RANGE 3 RANGE 3 RANGE 3 RANGE 3 [0, 0, 0, 0, 2, 4, 0, 4, 8, 0, 6, 12] RANGE 4 RANGE 3 [0, 0, 0, 0, 2, 4, 0, 4, 8, 0, 6, 12] (to translate a list comprehension to nested statements, remove the result expression, insert colons and newlines between the for/if statement parts, and put the append(result expression) part inside the innermost statement) </F> -- http://mail.python.org/mailman/listinfo/python-list