<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 15, 2016 at 10:40 AM, kirby urner <span dir="ltr"><<a href="mailto:kirby.urner@gmail.com" target="_blank">kirby.urner@gmail.com</a>></span> wrote:<br><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div><div><br>The increm function was originally looking in the global namespace for x...</div></div></div></div></blockquote><div><br><br></div><div>That's not quite right either as this is simply wrong as a complete module:<br><br>x = 0<br><br>def createIncrementor(x):<br>        def increm():<br>                x = x + 1<br>                return x<br>        return increm<br><br></div><div>The "referenced before assignment" error will occur regardless of the presence of a global x.<br><br></div><div>The choices to make increm work would be:<br><br>x = 100<br><br>def createIncrementor(x):<br>        def increm():<br>                global x<br>                x = x + 1<br>                return x<br>        return increm<br><br></div><div>(a module is a kind of closure / enclosure -- coming in ES6 right?)<br><br></div><div>or:<br><br>def createIncrementor(x):<br>        def increm():<br>                nonlocal x<br>                x = x + 1<br>                return x<br>        return increm<br><br></div><div>for an even more enclosed closure.<br><br></div><div>One may even remove x = from the module's global namespace and inject it retroactively:<br><br>>>> from closure import createIncrementor<br>>>> inc = createIncrementor(5)<br>>>> inc()<br>Traceback (most recent call last):<br>  File "<pyshell#80>", line 1, in <module><br>    inc()<br>  File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm<br>    x = x + 1<br>NameError: global name 'x' is not defined<br>>>> x = 100  # this won't work either as '__main__' is not where it looks<br>>>> inc()<br>Traceback (most recent call last):<br>  File "<pyshell#82>", line 1, in <module><br>    inc()<br>  File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm<br>    x = x + 1<br>NameError: global name 'x' is not defined<br>>>> closure.x = 100   # this would work if I added closure to the namespace<br>Traceback (most recent call last):<br>  File "<pyshell#83>", line 1, in <module><br>    closure.x = 100<br>NameError: name 'closure' is not defined<br>>>> import closure     # which I do here<br>>>> closure.x = 100<br>>>> inc()                    # and now the earlier imported function works with no problems<br>101<br></div><div><br><br></div><div>Kirby<br><br><br></div></div></div></div>