import reassignment different at module and function scope

Chris Rebert clp2 at
Sat Jan 31 08:47:23 CET 2009

On Fri, Jan 30, 2009 at 11:31 PM, Brendan Miller <catphive at> wrote:
> Hash: SHA1
> If I:
> import sys
> sys = sys.version
> This executes find but:
> import sys
> def f():
>    sys = sys.version
> This gives an error indicating that the sys on the right hand side of =
> is undefined. What gives?

More specifically, you get:
UnboundLocalError: local variable 'sys' referenced before assignment

Here's what's happening (IIRC):
Python sees (during "compilation") an assignment to 'sys' within the
function and (since there's no 'global' declaration within the
function) infers that the name 'sys', within the scope of the
function, *always* refers a local variable. IIRC, it does this for
significant optimization purposes.
However, when the function gets run and it goes to evaluate the
right-side of the assignment, it tries to lookup 'sys' as a local
variable, which obviously fails since it was never previously assigned
a value in the scope of the function, hence the error.

You can fix this by either renaming 'sys' within the function to something else:

def f():
    version = sys.version #now sys is no longer treated as local

or you can indicate that you want to refer to the global sys variable:

def f():
    global sys #tell python we mean the global sys
    sys = sys.version #this will rebind 'sys' in the outer, global scope


Follow the path of the Iguana...

More information about the Python-list mailing list