lambda in list comprehension acting funny
rustompmody at gmail.com
Sat Jul 14 04:31:24 CEST 2012
On Jul 13, 10:53 pm, Hans Mulder <han... at xs4all.nl> wrote:
> If you add `global VERBOSE` to `caller`, then there is only one
> variable named `VERBOSE` and what `function` does, depends on
> the most recent assignment to that variable.
> If you remove your `global VERBOSE`, then there are two
> variables by that name, one global and one local to `caller`.
> In that case, there is the question of which one `function`
> will use.
Good point. See below.
> The function `function` refers to a variable `VERBOSE` that
> isn't local. In some programming langauages, the interpreter
> would then scan the call stack at run-time, looking for a scope
> where that name is defined. It would find the local one in
> `caller`. This is known as "dynamic binding".
> Other interpreters use the `VERBOSE` that was in scope at
> the point in the program text where `function` was defined.
> In this case, that would be the global one. This is called
> "lexical binding".
> Some programming languages allow you to indicate on a per-
> variable basis whether you want dynamic or lexical binding.
> Python is firmly in the lexical camp. Dynamic binding is not
> available in Python, and never will be.
Thats a good intention. The question is whether it is uniformly
Consider the following
i = 100
j = [i for i in range(10)]
In python 2 two different 'i's could be returned. In python3 only one
i can be returned.
One could call it dynamic binding. Evidently Guido thinks it a bug
which is why he changed it.
The leakage of i in the OPs question is the same kind of bug.
This is 2012. Dynamic binding is considered a bug even by the lisp
community where it originated.
Lets at least call it a feature and a gotcha
More information about the Python-list