Fix Python – Why nested functions can access variables from outer functions, but are not allowed to modify them [duplicate]

Question

Asked By – Dhara

In the 2nd case below, Python tries to look for a local variable. When it doesn’t find one, why can’t it look in the outer scope like it does for the 1st case?

This looks for x in the local scope, then outer scope:

def f1():
    x = 5
    def f2():
         print x

This gives local variable 'x' referenced before assignment error:

def f1():
    x = 5
    def f2():
        x+=1

I am not allowed to modify the signature of function f2() so I can not pass and return values of x. However, I do need a way to modify x. Is there a way to explicitly tell Python to look for a variable name in the outer scope (something similar to the global keyword)?

Python version: 2.7

Now we will see solution for issue: Why nested functions can access variables from outer functions, but are not allowed to modify them [duplicate]


Answer

def f1():
    x = { 'value': 5 }
    def f2():
        x['value'] += 1

Workaround is to use a mutable object and update members of that object. Name binding is tricky in Python, sometimes.

This question is answered By – Tom Whittock

This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0