110

在下面的第二种情况下,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

4

2 回答 2

154

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

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

这篇文章也给出了 Python 2.x 的问题和解决方案。此外,请阅读PEP 3104以获取有关此主题的更多信息。

于 2012-08-16T12:49:16.557 回答
74
def f1():
    x = { 'value': 5 }
    def f2():
        x['value'] += 1

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

于 2012-08-16T12:50:38.267 回答