On 3/24/14 5:43 PM, Marko Rauhamaa wrote:
Mark H Harris<harrismh...@gmail.com>:

    Yes, its about closures, totally;  the most confusing aspect of
lambda in python is not only the syntax but the idea of scope and
closure (for that syntax).  Everyone is confused by this initially, not
because its complicated, but because its confusing.  An example:

adders= list(range(4))
for n in adders:
        adders[n]=lambda a: a+n
print(adders[1](3))
6

    The expected value as perceived by "normal" people is 4.

1. No, I don't think that understanding is automatically natural.

It might not seem that way for an expert, but if you Google python lambda function closure(s) you will notice that this is pretty much the natural way of interpreting things.

Of course the problem is that the closure grabs the *last* number in the list which is used for each of the adder[] functions created. So, in other words, three (3) is the number added in each of the adder functions. But here is the rub, it is not *ever* clear to people (even experienced python coders, me for instance) that this is how it should work. What is needed is the explicit closure "grab" recommended by ChrisA. But for the normal, that is just as bad (conceptually) because while it works it strays FAR away from expected lambda constructs known to functional programmers, and it is difficult to explain to non functional programmers... a proverbial catch 22.

marcus
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to