闭包:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回内部函数,我们把这个使用外部函数变量的内部函数称为闭包,也叫做闭包函数。
def outer(logo):
def inner(msg):
print(f"<{logo}>-<{msg}>-<{logo}>")
return inner
fn1 = outer("稀土掘金")
fn1("王拿铁") # <稀土掘金>-<王拿铁>-<稀土掘金>
fn1("学python") # <稀土掘金>-<学python>-<稀土掘金>
fn2 = outer("python")
fn2("王拿铁") # <python>-<王拿铁>-<python>
fn2("学python") # <python>-<学python>-<python>
使用nonlocal关键字,可以在内部函数中修改外部的变量。
def outer(num1):
def inner(num2):
nonlocal num1
num1 += num2
print(num1)
return inner
number = outer(10)
number(2) # 12
number(3) # 15
python中的闭包和js的闭包是很相似的。其实闭包就可以理解为创造一个可持续访问的非全局变量,供内部函数使用。 比如上边的例子,number()就是一个闭包函数,只要调用number(),他就会对num1变量进行操作。多次操作就会在上次处理过之后的值进行操作,而不会从初始值进行操作。
闭包的优点:
- 无需定义全局变量即可实现通过函数,持续的访问、修改某个值。
- 闭包使用的变量的所用于在函数内,很难被错误的调用修改。
闭包的缺点:
- 由于内部函数持续引入外部函数的值,所以会导致这一部分内存空间不被释放,一直被占用。也叫做内存泄露。