python——闭包

2019-07-15  本文已影响0人  ELLENXX
def fnx(x):
    def fny(y):
        return x*y
    return fny
i=fnx(3)
print(i)

输出:<function fnx.<locals>.fny at 0x000002B19A2E77B8>

i=fnx(3),fnx(3)的返回值就是一个函数fny,也就是i指向了内部函数fny

上面的代码特征:在一个外部函数中定义了一个内函数,内部函数里运用了外部函数的临时变量,并且外函数的返回值是内函数的引用。这是一个闭包。

当函数执行结束后,会把自己的函数内定义的变量都释放还给内存,之后变量会被请款,但如果是闭包,外部函数执行时,自己的变量会在将来的内部函数中用到,自己在结束的时候,返回内函数的同时,会把外函数的临时变量送给内函数绑定在一起。所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。

def fnx(x):
    def fny(y):
        return x*y
    return fny
i=fnx(3)
print(i(4))

输出:12

如果想要在内部函数中改外部函数的值,可以将外部函数的临时变量变成可修改变量

def fnp():
    p=[2]
    def fnq():
        p[0]*=p[0]
        return p[0]
    return fnq
print(fnp()())

输出:4

还可以使用nonlocal

def fnp():
    p=3
    def fnq():
        nonlocal p
        p*=p
        return p
    return fnq
print(fnp()())

输出:9

上一篇下一篇

猜你喜欢

热点阅读