闭包(closure)
当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回函数中,这种结果,叫闭包
example1:
1 def test(*args): 2 3 def test_1(): 4 rst = 0 5 for i in args:#这里使用了函数外部的参数 6 rst += i 7 return rst 8 return test_1#将函数作为返回值返回,相关参数和变量保存在返回的函数中 9 10 a = test(1,2,3) 11 print(a())
这上面就是一个常见的闭包
闭包也有坑人的地方
example2:
def count(): fs = [] #这里定义了一个列表 for i in range(1,4): #定义了一个函数f #f是一个闭包的结构 def f(): return i*i#这里不会马上计算 要返回的时候才会计算 fs.append(f) return fs f1,f2,f3 = count() print(f1()) print(f2()) print(f3()) # 9 # 9 # 9 # [Finished in 0.2s] # 为什么会是999呢,造成上述状况的原因是,返回函数引用了变量i, # 而i并不是立即执行,而是等腰三个函数都返回的时候才统一执行 # 此时i已经变成了3,最终调用的时候 返回的都是 3*3 #
上述问题得到结果: 返回闭包时,不能引用任何循环变量
解决办法:
再在外面套一个函数
example3:
def count2(): fs = [] #这里定义了一个列表 def f(i):#将i作为参数传入进去 def g(): return i*i#这里i返回的时候会马上执行 return g for i in range(1,4): fs.append(f(i)) return fs f1,f2,f3 = count2() print(f1()) print(f2()) print(f3()) #1 #4 #9
原文地址:https://www.cnblogs.com/lonelyshy/p/9603689.html
时间: 2024-10-17 03:40:29