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

28 浏览
0 Comments

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

在下面的第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

0
0 Comments

为什么嵌套函数可以访问外部函数的变量,但不能修改它们的原因是Python的名称绑定机制。为了解决这个问题,可以使用可变对象并更新该对象的成员。以下是一种解决方法,将一个单元素列表代替字典的使用。同时,在Python 2.7中,使用nonlocalglobal也是可行的,但global不是一个好的选择,因为它会污染全局命名空间,并且nonlocal是Python 3的特性。为了避免写父作用域中的x['value'],可以考虑将value作为参数传递给嵌套函数,然后从嵌套作用域返回value给父作用域。

0
0 Comments

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的修改。这就是解决这个问题的方法。

0