4 ms·
The issue is with scoping, not the closure mechanism. Python will by default shadow variables in an enclosing scope instead of overwriting them during assignme
by njohnson41 12y ago
The issue is with scoping, not the closure mechanism.
Python will by default shadow variables in an enclosing scope instead of overwriting them during assignment, to prevent accidental introduction of global state. You can use the "global" keyword to force overwriting the outer variable. The list hack also works because it is a mutable data structure, but I wouldn't recommend it.
- skatenerd 12y agoInteresting - I can read from the variable but I can't assign to it.
- overgard 12y agoYou can assign to it, you just have to be explicit about that being what you want to do. (Explicit being better than implicit is part of the python philosophy)
- ptx 12y agoPython decides for each name if it refers to a local or non-local (or global) variable when the function is defined. If you assign to it, that fact is used to decide that the name refers to a local variable. Otherwise, it must refer to a global variable or a variable in some parent scope. This means that in the following code, "x" will refer to a local variable for the whole function body: x = "foo" def f(): print(x) x = 42 f() ...so instead of printing "foo" (the value of the global variable) the print statement will raise an exception: UnboundLocalError: local variable 'x' referenced before assignment If you meant it to refer to a global variable or something in the parent scope, simply put "global x" or "nonlocal x", respectively, at the start of the function. Again, that applies to the whole function body, so the assignment in this example would change the value of the global variable.
- ufo 12y agoWhat you actually want is "nonlocal". "global" will force the assignment to be on a global variable.