闭包中内部函数引用外部函数变量引发的问题

def f():
  a = 1
  def f1():
    a = a + 1
    return a
  return f1

执行是会报错: UnboundLocalError
改一下:

def f():
  a = 1
  def f1():
    b = a + 1
    return b
  return f1

可以正确运行结果为: 2
原因分析如下:
a = a + 1 这是个赋值表达式,在python中变量是不需要提取声明的,一个变量第一次赋值就是声明了这个变量。a = a + 1 这个表达式的意思是声明一个局部变量a并将它 + 1后赋值给它自己,而此时a 还没有初始化(没有被赋值),所以会出现报错 UnboundLocalError: local variable 'a' referenced before assignment
虽然闭包中内部函数可以引用外部函数的变量,但a = a + 1 中“=”号前的a覆盖掉了外部函数f中的局部变量a=1,所以a = a + 1就会出现未定义的错误。只要外部函数f中的局部变量a 不被覆盖就可以解决问题。所以改成b = a + 1就可以正常运行。其实还可以这样改:

def f():
  a = [1]
  def f1():
    a[0] = a[0] + 1
    return a[0]
  return f1

这也是可以正常运行的,因为此时的外部函数f的局部变量a 是一个可变对象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,259评论 9 118
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 27,633评论 5 19
  • 他们说爱情的花儿,不断地从天上掉下来,寻爱的人们如果在同一秒同时接到爱情花,将开始疯狂相恋,不分年龄,性别,时空,...
    LauChiYung阅读 518评论 0 2
  • 人生最幸福的事不是活着,而是我可以选择!也许你会问,活着还不幸福?《士兵突击》里许三多有句经典的台词就是“幸福就是...
    AAAmy33阅读 258评论 0 0
  • 姓名:权芝婷(女主) 年龄:18岁 星座:魔蝎座(小草:因为我不清楚别的星座的真实性格,所以采用我的...
    兔子bebi阅读 417评论 0 0