美文网首页
闭包中内部函数引用外部函数变量引发的问题

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

作者: 羽煊 | 来源:发表于2017-12-08 10:33 被阅读0次
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 是一个可变对象

相关文章

  • 闭包和立即执行函数

    闭包闭包:内部的函数引用了外部的函数的变量,则产生闭包。闭包的作用:把变量封装在函数中,只有内部函数可以用,让函数...

  • js-----闭包

    闭包: 当内部函数被保存到外部的时候,会形成闭包 函数嵌套函数,内部函数可以引用外部函数的参数和变量,外部函数的参...

  • Python闭包

    什么是闭包?闭包就是在一个函数内部再创建一个函数,内部的函数引用外部函数的变量,变量和内部的函数加起来成为闭包,闭...

  • 内存泄漏

    闭包 在闭包中,内部函数引用外部函数变量,实际上是应用了外部函数的作用域(scope)对象 如果作用域对象所在函数...

  • 闭包和继承

    闭包 嵌套的内部函数引用外部函数内的参数,外部调用时全局有一个变量就形成了闭包,执行函数后由于内部函数引用了参数,...

  • python--闭包

    内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。

  • 变量

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包做...

  • 变量和函数、闭包

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包存...

  • 13_day变量和函数、闭包

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包做...

  • js 变量 闭包

    闭包: 什么是闭包? 函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾机构回收; 用闭包做...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/svasixtx.html