[Python-Dev] 2.5 and beyond (original) (raw)

Terry Reedy tjreedy at udel.edu
Sat Jul 1 07:00:40 CEST 2006


"Giovanni Bajo" <rasky at develer.com> wrote in message news:027f01c69caf$b1c20450$d1b12997 at bagio...

[Giovanni Bajo]

Yes but:

a = [] for i in range(10): ... a.append(lambda: i) ... print [x() for x in a] [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

. Do you agree that it would be ideal if the above code generated range(10) instead of [9]*10,

No. You are trying to reify an optical illusion resulting from putting a constant function definition inside a loop. Making the meaning of 'def f(): return i' depend on the definition-time context by partially and variably evaluating the body would make code much harder to read and understand. Consider:

if a: i=666 def f(): return i

At worse, couldn't Python do the "i=i" trick by itself when it sees that i is a local in the outer scope? Right now I can't think off-hand of a case in which this would break things.

It would make code more fragile.

for i in range(666): print name[i] ... ... def total(num): return cost[item]*num

Now someone decides first loop should have more expressive loop var name and changes the first line to

for item in range(666): print name[item]

and the meaning of total is completely changed. Adding such long-range coupling between language statements strikes me as a poor idea.

Terry Jan Reedy



More information about the Python-Dev mailing list