jhermann wrote:
I didn't see this mentioned in the thread yet: the double-lambda is unnecessary (and a hack).
Well, the alternative -- abusing default argument values -- is seen by many to be a hack as well, possibly a worse one. It doesn't work in general, e.g. it fails if the function needs to be called with a variable number of arguments. The double lambda is conceptually more sound in some ways, and can be made to work correctly in all cases. The root of the problem actually has nothing to do with lambdas or static vs. non-static scoping. It's the fact that Python's for-loop doesn't create a new environment for the loop variable each time around, but re-uses a slot in the containing environment. Contrast this with Scheme, where the equivalent of a for-loop *does* create a new environment for each value of the loop variable. Effectively it's using a double lambda, except that one of the lambdas is folded into the syntax of the loop, so you don't notice it. So if anything were to be done to the language to fix this, it really should be focused on fixing the semantics of the for-loop. Unfortunately, the fact that the loop variable leaks out of the scope of the loop is regarded as a feature, so anything which changes that seems to be a non-starter. -- Greg -- http://mail.python.org/mailman/listinfo/python-list