On Mon, Sep 26, 2011 at 12:27 PM, Bruce Leban
The keyword nonlocal means that this binding is not local to this scope but can be found up the call stack. In contrast, your usage means the binding is local to this function, created before the function is called the first time and shared with all calls to this function. Those are orthogonal scopes.
See my reply to Paul - while I agree that visibility and lifetime are different aspects of named references, it isn't like they're independent. A nonlocal reference from an inner function has a direct effect on the lifecycle of an otherwise local variable in the outer function. Consider the following two functions: def f(): x = 0 return x Here, 'x' is an ordinary local variable - it only exists while the frame is executing. def f(): x = 0 def inner(): nonlocal x x += 1 return x return inner Now, the use of 'nonlocal' in the inner function has *changed the lifecycle* of x. It is now a nonlocal variable - it survives beyond the execution of the function that defines it. Paul was quite right to point out that most developers only think about the visibility aspect of 'nonlocal', since they're looking at the impact from the point of view of the inner function, but that doesn't mean the lifecycle impact on the outer function that I want to highlight is arbitrary or irrelevant. Regards, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia