On Fri, Apr 15, 2016 at 10:40 AM, kirby urner <kirby.ur...@gmail.com> wrote:
> > The increm function was originally looking in the global namespace for x... > That's not quite right either as this is simply wrong as a complete module: x = 0 def createIncrementor(x): def increm(): x = x + 1 return x return increm The "referenced before assignment" error will occur regardless of the presence of a global x. The choices to make increm work would be: x = 100 def createIncrementor(x): def increm(): global x x = x + 1 return x return increm (a module is a kind of closure / enclosure -- coming in ES6 right?) or: def createIncrementor(x): def increm(): nonlocal x x = x + 1 return x return increm for an even more enclosed closure. One may even remove x = from the module's global namespace and inject it retroactively: >>> from closure import createIncrementor >>> inc = createIncrementor(5) >>> inc() Traceback (most recent call last): File "<pyshell#80>", line 1, in <module> inc() File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm x = x + 1 NameError: global name 'x' is not defined >>> x = 100 # this won't work either as '__main__' is not where it looks >>> inc() Traceback (most recent call last): File "<pyshell#82>", line 1, in <module> inc() File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm x = x + 1 NameError: global name 'x' is not defined >>> closure.x = 100 # this would work if I added closure to the namespace Traceback (most recent call last): File "<pyshell#83>", line 1, in <module> closure.x = 100 NameError: name 'closure' is not defined >>> import closure # which I do here >>> closure.x = 100 >>> inc() # and now the earlier imported function works with no problems 101 Kirby
_______________________________________________ Edu-sig mailing list Edu-sig@python.org https://mail.python.org/mailman/listinfo/edu-sig