func2 在 func1 之内,其作用域的范围等同于闭包(至于什么是闭包,详见我的这篇文章:Python 的闭包和装饰器),因此 x 实际上是在父函数 func1 的作用域内,func2 调用它类似于 func1 调用全局变量,只能读取而不能直接改写 x。但是如果你使用列表对象的 x,则 x[0] 并非 x对象 ,而是 x 的元素,因此可以被改写。
def f1():
i=[1]
def f2():
i[0]=i[0]+1
其实这是 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
可以使用 nonlocal
def f1():
i=1
def f2():
nonlocal i
i=i+1
感谢,已解决问题