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

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

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

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

这给local variable 'x' referenced before assignment错误local variable 'x' referenced before assignment

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

我不允许修改函数f2()的签名,所以我不能传递和返回x的值。 但是,我确实需要一种修改x的方法。 有没有一种方法可以明确告诉Python在外部作用域(类似于global关键字)寻找variables名?

Python版本:2.7

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

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

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

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

这篇文章给出了Python 2.x的问题和解决scheme。 此外,请阅读PEP 3104了解更多关于此主题的信息。