猿问

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

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

青春有我

有yield嘻嘻deffoo(n):whileTrue:yieldnn+=1>>>p=foo(10)>>>p.next()10>>>p.next()11>>>p.next()12

aluckdog

这是因为int是不可变的,你对它+=1,它会构建出一个新的加了1的int,而count指向的那个int是没有变的,这对所有的不可变对象都是一样的道理。而list是可变的,就是说你可以不用改变count的指向就可以改变count的内容。至于为什么会有UnboundLocalError,参见这个官方faq。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答