Dave Kuhlman wrote: > I've written up a few notes on Python namespaces and scopes. If > anyone has corrections, comments, or suggestions, I'd appreciate > them. You can find my comments here: > > http://www.rexx.com/~dkuhlman/python_comments.html#namespaces
You wrote, "If a variable is assigned a value /anywhere/ in a scope (...), then that variable is local to that scope. Otherwise, the variable is global." You omit the enclosing scope and the builtin namespace. A variable can be defined in - local scope - any of zero or more enclosing scopes - global scope - builtin namespace Names are also bound by for statements and except clauses. You might note that augmented assignment (e.g. a += 1) counts as assignment in the local scope. This is a common cause of UnboundLocalError: In [5]: a=1 In [6]: def foo(): ...: a+=1 ...: ...: In [7]: foo() --------------------------------------------------------------------------- exceptions.UnboundLocalError Traceback (most recent call last) D:\Projects\e3po\<ipython console> D:\Projects\e3po\<ipython console> in foo() UnboundLocalError: local variable 'a' referenced before assignment I think modifying globals() is guaranteed to work. Modifying locals() only works at global scope, i.e. when locals() is globals(). You wrote, "Note that for lexically/statically nested scopes (for example, a function defined inside a function), it seems that globals() and locals() still give access to all items in the accessible namespaces." I'm not sure what you mean by this. locals() doesn't give access to items in nested scopes: In [1]: x=1 In [2]: def maker(): ...: y=2 ...: def showLocals(): ...: z=3 ...: print locals() ...: return showLocals ...: In [3]: sl=maker() In [4]: sl() {'z': 3} See also http://docs.python.org/ref/naming.html Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor