Skip to content Skip to sidebar Skip to footer

"local Variable Referenced Before Assignment" — Only Functions?

Take the following code: import something def Foo(): something = something.SomeClass() return something …this is apparently not valid code: UnboundLocalError: local var

Solution 1:

From the python class documentation:

Class definitions place yet another namespace in the local scope.

A special quirk of Python is that – if no global statement is in effect – assignments to names always go into the innermost scope. Assignments do not copy data — they just bind names to objects. The same is true for deletions: the statement del x removes the binding of x from the namespace referenced by the local scope. In fact, all operations that introduce new names use the local scope: in particular, import statements and function definitions bind the module or function name in the local scope. (The global statement can be used to indicate that particular variables live in the global scope.)

So within a function (or a scope) the assignment creates a local unbound variable that is accessed before it is bound, whereas in a class definition it creates an entry in the "namespace" dictionary of that class on assignment, allowing the resolution of something to the outer namespace (the module namespace).

Solution 2:

Consider the following example which may help to clarify this:

import datetime

classFoo(object):
    datetime = datetime.datetime

>>> datetime
<module 'datetime'from'/usr/lib/python2.6/lib-dynload/datetime.so'>
>>> Foo.datetime
<type'datetime.datetime'>

Note that the line datetime = datetime.datetime is actually assigning to the name Foo.datetime, which is not ambiguous with the global datetime (like it would be if the same code were in the function).

In summary, because class definitions create a new namespace as well as a new scope, you are allowed to directly access a name in an enclosing scope and assign to the same name in the local scope.

Post a Comment for ""local Variable Referenced Before Assignment" — Only Functions?"