首页 新闻 会员 周边 捐助

python关于局部变量的错误

0
[已解决问题] 解决于 2019-03-25 11:24
def f1():
    i=1
    def f2():
        i=i+1

类似这样的代码会报

UnboundLocalError: local variable 'i' referenced before assignment

我的想法是f2中修改f1-i的值,但是我让解释器不理解f2-i是否就是f1-i了,是吗?

请问这样的逻辑错误在哪里?应该如何修改?谢谢

Velscode的主页 Velscode | 菜鸟二级 | 园豆:204
提问于:2019-03-25 10:47
< >
分享
最佳答案
1

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
Velscode | 菜鸟二级 |园豆:204 | 2019-03-25 11:23
其他回答(1)
0

可以使用 nonlocal

def f1():
    i=1
    def f2():
        nonlocal i
        i=i+1
dudu | 园豆:30939 (高人七级) | 2019-03-25 11:23

感谢,已解决问题

支持(1) 反对(0) Velscode | 园豆:204 (菜鸟二级) | 2019-03-25 11:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册