On Jul 13, 10:53 pm, Hans Mulder <han...@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 realized. Consider the following def foo(x): i = 100 if x: j = [i for i in range(10)] return i else: return i 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. tl;dr version: 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 -- http://mail.python.org/mailman/listinfo/python-list