今天在写一个简单的嵌套函数时,需要在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