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

Reply via email to