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

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 是一个可变对象

你可能感兴趣的:(闭包中内部函数引用外部函数变量引发的问题)