为了账号安全,请及时绑定邮箱和手机立即绑定

如何用 python 写出像 javascript 这样的闭包?

如何用 python 写出像 javascript 这样的闭包?

qq_遁去的一_1 2019-04-13 08:45:47
varfoo=function(n){varcount=n;functionbar(){n=countcount+=1;returnn}returnbar}>>>p=foo(10)>>>p()10>>>p()11>>>p()12python由于作用域的关系,函数内可以访问函数外部环境变量的值。但是不能对这个外部的环境变量进行操作。好像python的闭包不是这么用的?两个函数之间共享一个变量最方便的还是在一个class中用self?deffunc(data):count=datadefwrap():count+=1returncountreturnwrap>>>p=func(10)>>>p()UnboundLocalError:localvariable'count'referencedbeforeassignment#但是不是赋值,而是用一个数组保存数组,就可以deffunc(data):count=[data]defwrap():count[0]+=1returncount[0]returnwrap>>>p=func(10)>>>p()11>>p()12>>p()13谁能具体解释一下这个的原因?
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

有yield嘻嘻
deffoo(n):
whileTrue:
yieldn
n+=1
>>>p=foo(10)
>>>p.next()
10
>>>p.next()
11
>>>p.next()
12
                            
查看完整回答
反对 回复 2019-04-13
?
aluckdog

TA贡献1847条经验 获得超7个赞

这是因为int是不可变的,你对它+=1,它会构建出一个新的加了1的int,而count指向的那个int是没有变的,这对所有的不可变对象都是一样的道理。而list是可变的,就是说你可以不用改变count的指向就可以改变count的内容。
至于为什么会有UnboundLocalError,参见这个官方faq。
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信