首页 > 其他 > 详细

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

时间:2019-03-25 13:42:45      阅读:180      评论:0      收藏:0      [点我收藏+]

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

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

原文:https://www.cnblogs.com/velscode/p/10592793.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!