嵌套函数局部变量修改问题

今天在写一个简单的嵌套函数时,需要在f2()中修改上层函数f1()的局部变量

def f1():
    i=1
    def f2():
        i=i+1 
    return f2()

程序报错

UnboundLocalError: local variable 'i' referenced before assignment

一查,大概是局部变量作用域的问题

f2 在 f1 之内,其作用域的范围等同于闭包,因此 x 实际上是在父函数 f1的作用域内,f2调用它类似于 f1调用全局变量,只能读取而不能直接改写 x。

但是如果你使用列表对象的 x,则 x[0] 并非 x对象 ,而是 x 的元素,因此可以被改写。

def f1():
    i=[1]
    def f2():
        i[0]=i[0]+1
    return f2()

其实这是 python 2 的一个bug,在 python 3 中引入了 nonlocal语句,其类似于 global 语句,只不过是用来声明某个变量是父函数的那个变量,以便于子函数可以直接改写该变量。

在python 2 中,只有用列表对象了,不过在 python 3 中可以这么写:

def f1():
    i=1
    def f2():
        nonlocal i      #加上这一句声明这里的 i 是父函数的 i,之后便可以直接改写 i
        i=i+1
posted @ 2019-03-25 11:33  Velscode  阅读(394)  评论(0编辑  收藏