比喻:

通俗地讲就是别人家有某个东西,你想拿到但是因为权限不够(不打死你才怪),但是你可以跟家里的孩子套近乎,通过他拿到!这个家就是局部作用域,外部无法访问内部变量,孩子是从家里返回对象,对家里的东西有访问权限,借助返回对象间接访问内部变量!

def outer():      #------别人家
x = 10 #别人家里的东西
def inner(): #内部函数------别人家的小孩
print(x) #外部函数的一个变量
return inner #------返回小孩



f = outer() #到别人家 “套近乎”别人的小孩,套出(返回)小孩f
f() #f小孩执行



# 调用inner()函数的方法

1、法一
outer()()

2、法二
f = outer()
f()





闭包的概念

在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。—— 维基百科

用比较容易懂的人话说,就是当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。看例子。


【闭包】Python中的闭包_持久性

​https://baijiahao.baidu.com/s?id=1601023189180094497&wfr=spider&for=pc​

何时使用闭包

其实闭包在Python中很常见,只不过你没特别注意这就是一个闭包。比如Python中的装饰器Decorator,假如你需要写一个带参数的装饰器,那么一般都会生成闭包。

我个人认为,闭包存在的意义就是它夹带了外部变量(私货),如果它不夹带私货,它和普通的函数就没有任何区别。同一个的函数夹带了不同的私货,就实现了不同的功能。其实你也可以这么理解,闭包和面向接口编程的概念很像,可以把闭包理解成轻量级的接口封装。


python 函数内部修改外部变量

如果内部修改外部变量需要nonlocal,global 

def f1():
print("in f1..")
num=111
def f2():
nonlocal num
num=222
print(num)
f2()
print(num)


f1()