嵌套函数:什么是嵌套函数
使用外部函数中变量
def out(): x = 5 def inn(): print("inn函数中 x = {}".format(y)) print("out函数中 x = {}".format(x)) inn() out() 结果: inn函数中 x = 5 out函数中 x = 5
内部函数是可以引用外部函数的变量【仅限于定义内部函数的外部函数】
修改外部变量中函数
def out(): x = 5 def inn(): x = 1 x += 1 print("inn函数中 x = {}".format(x)) inn() print("out函数中 x = {}".format(x)) out() 结果: inn函数中 x = 2 out函数中 x = 5
内部函数是可以重新定义外部函数的变量,【不能改变外部函数中的变量,只是局限于内部使用】
闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量
自由变量:未在本地作用域中定义的变量。例如定义在内存函数外的外层函数的作用域中的变量
def count(): c = [0] def inc(): c[0] +=1 return c[0] return inc foo = count() print(foo()) c =100 #定义的变量没有引用到,全局变量是不能影响局部变量的 print(foo()) #这个地方因为python垃圾回收机制的原因的,所以会出现2 结果 1 2
c = [ 0 ] ,定义的是一个可变类型的列表,因此不会出现:x +=1的问题
那如何解决x +=1 的问题尼
可以gloabl解决,但是这样用,就不是闭包了
x = 100 def out(): x = 5 def inn(): global x x += 1 return x return inn foo = out() print(foo()) 结果: 101
nonlocal关键字
使用了nonlocal关键字,将变量标记为不在本地作用域定义,而在上级的某一级局部作用域中定义,但不 能是全局作用域中定义
def out(): x = 5 def inn(): nonlocal x x += 1 return x return inn foo = out() print(foo()) 结果: 6
不能作用于,全局变量中【报错:SyntaxError: no binding for nonlocal 'y' found】
y= 1 def out(): nonlocal y y +=1 x = 5 def inn(): nonlocal x x += 1 return x return inn foo = out() print(foo()) 结果: SyntaxError: no binding for nonlocal 'y' found