Skip to content Skip to sidebar Skip to footer

Unbound Variable And Name

According to the python reference manual we have When a name is not found at all, a NameError exception is raised. If the name refers to a local variable that has not been bound,

Solution 1:

You can refer to a name without having assigned to it:

>>> foobar
Traceback (most recent calllast):
  File "<stdin>", line 1, in<module>
NameError: name 'foobar'isnot defined

Here foobar is being referred to, but was never assigned to. This raises a NameError because the name was never bound.

More subtly, here assignment is not happening because the line that does is never run:

>>>deffoo():...ifFalse:...        spam = 'eggs'...print spam...>>>foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in foo
UnboundLocalError: local variable 'spam' referenced before assignment

Because spam = 'eggs' is never executed, print spam raises an UnboudLocalError.

Note that nowhere in Python is a name ever declared. You bind or don't bind, declaration is not part of the language.

Instead, binding is used to determine the scope of a name; binding operations include assignment, names used for a for loop, function parameters, import statements, name to hold a caught exception in an except clause, the name for a context manager in a with statement all bind names.

If a name is bound in a scope (such as in a function) then it is a local name, unless you use a global statement (or a nonlocal statement in Python 3) to explicitly mark the name as a global (or a closure) instead.

So the following is an error:

>>>foo = None>>>defbar():...ifFalse:...        foo = 'spam'...print foo...>>>bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in bar
UnboundLocalError: local variable 'foo' referenced before assignment

because foo is being bound somewhere in the bar function scope. But if you mark foo as a global, the function works:

>>>foo = None>>>defbar():...global foo...ifFalse:...        foo = 'spam'...print foo...>>>bar()
None

because now the Python compiler knows you wanted foo to be a global instead.

This is all documented in the Naming and Binding section of the Python reference documentation.

Solution 2:

One more place is when the variable is declared in global scope and if it is used in function scope, it should specifically refer as global otherwise UnboundLocalError occurs. Following is the example:

var = 123def myfunc():
    var = var + 1print varmyfunc()

Error:

UnboundLocalError: local variable 'var' referenced before assignment

Post a Comment for "Unbound Variable And Name"