为什么嵌套函数可以从外部函数访问变量,但不允许修改它们

时间:2012-08-16 12:41:45

标签: python scope

在下面的第二种情况中,Python试图寻找一个局部变量。当它没有找到一个时,为什么它不能像在第一种情况下那样在外部范围内看?

这在本地范围内查找x,然后在外部范围中查找:

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

这会导致local variable 'x' referenced before assignment错误:

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

我不允许修改函数f2()的签名,所以我不能传递和返回x的值。但是,我确实需要一种方法来修改x。有没有办法明确告诉Python在外部范围内查找变量名称(类似于global关键字)?

Python版本:2.7

2 个答案:

答案 0 :(得分:64)

在Python 3.x中,这是可能的:

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

问题及其解决方案,对于Python 2.x,也在this帖子中给出。另外,有关此主题的更多信息,请阅读PEP 3104

答案 1 :(得分:50)

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

解决方法是使用可变对象并更新该对象的成员。有时,Python中的名称绑定很棘手。