python中的闭包

165 阅读1分钟

闭包:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回内部函数,我们把这个使用外部函数变量的内部函数称为闭包,也叫做闭包函数。

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变量进行操作。多次操作就会在上次处理过之后的值进行操作,而不会从初始值进行操作。

闭包的优点:

  • 无需定义全局变量即可实现通过函数,持续的访问、修改某个值。
  • 闭包使用的变量的所用于在函数内,很难被错误的调用修改。

闭包的缺点:

  • 由于内部函数持续引入外部函数的值,所以会导致这一部分内存空间不被释放,一直被占用。也叫做内存泄露。