python中的闭包(closure)

在学习js闭包时,无意间发现了Python中也有闭包这一概念,顺便自己也多看了几篇文章。仔细琢磨了一下,可能还有好多描述不准确,请多多包含。

 来看代码

def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()

调用函数返回的是一个list,里面包含三个因for循环返回的func。要注意的是,当运行到 fs.append时,这里是f函数对象本身被当做参数传了进去,所以并不会直接执行。当最下面调用f1()f2()f3()时,list中的3个返回的函数才会真正执行,然而会发现执行的结果是 9,9,9。因为此时的i是3。

    如果我们想用循环变量怎么办呢?看下面的代码

def foo():
fs=[]
for i in range(1,4):
def f(i):
def g():
return i*i
return g
fs.append(f(i))
return fs
print foo()
print foo()[0]()

这个代码体现了闭包的特点,每次循环的时候,把变量 f(i) 当参数传进了list中,也就保留了当时的函数的变量。在之后引用函数的时候,才不会出现第一种代码的情况。闭包重要的一点,就是返回的函数对象当时并不会执行,而是等下次调用的时候才会一层一层的执行。而返回的是一个函数调用,则会执行,再保存返回结果,在此例中,fs.append(f(i))此处,f(i)执行并返回一个g 函数对象本身。等到函数最后 print 时 才再一个调用函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值