"Giovanni Bajo" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> [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
<intervening code>
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]
...
<intervening code>
...
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



_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to