为什么嵌套函数可以访问外部函数的变量,但不允许修改它们。
为什么嵌套函数可以访问外部函数的变量,但不允许修改它们。
在下面的第2个案例中,Python尝试查找一个局部变量。当它找不到时,为什么不能像第1个案例那样查找外部作用域呢?
这个代码在局部作用域和外部作用域中查找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
Python中允许嵌套函数访问外部函数的变量,但不允许修改它们。这个问题的出现是因为在Python 2.x版本中没有类似于Python 3.x版本中的nonlocal
语句,无法在嵌套函数中修改外部函数的变量。而解决方法是使用nonlocal
语句来声明外部函数中的变量,使得嵌套函数能够修改这些变量。
具体解决方法可以参考Stack Overflow上的这个帖子。此外,还可以阅读PEP 3104获取更多关于这个问题的信息。
在Python 3.x中,可以使用以下代码来实现:
def f1(): x = 5 def f2(): nonlocal x x+=1 return f2
这样,嵌套函数f2就可以访问并修改外部函数f1中的变量x。而在Python 2.x中,可以通过在外部函数中使用一个容器对象(例如列表)来实现类似的效果,如下所示:
def f1(): x = [5] def f2(): x[0]+=1 return f2
这样,嵌套函数f2可以通过修改x列表中的元素来实现对外部函数f1中变量x的修改。这就是解决这个问题的方法。