返回信息流在 500 lines or less 上看到了这篇[Python Interpreter](http://aosabook.org/en/500L/a-python-interpreter-written-in-python.html),其中一个函数是这样写的,代码如下:
``` python
def make_cell(value):
"""Create a real Python closure and grab a cell."""
# Thanks to Alex Gaynor for help with this bit of twistiness.
fn = (lambda x: lambda: x)(value) #这句看不懂
return fn.__closure__[0]
```
Google了一下,发现这个[StackOverFlow](http://stackoverflow.com/questions/10452770/python-lambdas-binding-to-local-values)问题的第二个答案给出的两种solution中用到了类似的语句—— double-lambda,
我反复读了一下这个题主的问题,还是不清楚为什么会发生这种问题。
``` python
def pv(v) :
print v
def test() :
value = []
value.append(0)
value.append(1)
x=[]
for v in value :
x.append(lambda : pv(v)) #这句需要改
return x
x = test()
for xx in x:
xx()
```
为什么注释的那句的`lambda : pv(v)`改成 `(lambda v: lambda: pv(v))(v)`就可以了呢?
这是一条镜像帖。来源:北邮人论坛 / python / #14810同步于 2016/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
Double lambda是什么意思?什么时候用?
MrWanted
2016/7/5镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
首先,每个闭包在创建的时候都有所处的环境,在执行的时候也需要在此环境中执行。x.append(lambda : pv(v))两次创建的闭包所处的环境是一样的,v指向的值都是value[1](因为test函数结束后,v指向value[1])。但是如果是(lambda v: lambda: pv(v))(v),函数在执行的时候会拓展环境,会创建一个新的v引用,分别执向value[0]和value[1]。这时他们两个所处的环境是不一样的。
谢谢!讲得很清楚,看明白是怎么一回事了。
一直忽略了v是在最后的循环执行时才取过来的。
谢谢
【 在 poiuasd 的大作中提到: 】
: 首先,每个闭包在创建的时候都有所处的环境,在执行的时候也需要在此环境中执行。x.append(lambda : pv(v))两次创建的闭包所处的环境是一样的,v指向的值都是value[1](因为test函数结束后,v指向value[1])。但是如果是(lambda v: lambda: pv(v))(v),函数在执行的时候会拓展环境,会创建一个新的v引用,分别执向value[0]和value[1]。这时他们两个所处的环境是不一样的。
【 在 MrWanted 的大作中提到: 】
: 谢谢!讲得很清楚,看明白是怎么一回事了。
: 一直忽略了v是在最后的循环执行时才取过来的。
: 谢谢
v指向的值都是value[1](因为test函数结束后,v指向value[1])...这句没看明白,lz能否帮忙解释一下,谢谢.
先弄清楚一件事,x这个list里面放的是什么?是函数对象,还是函数的返回值?
在最后的循环里才真正的调用了list里的函数,而此时v已经指向value[1]了。
【 在 solosseason 的大作中提到: 】
: v指向的值都是value[1](因为test函数结束后,v指向value[1])...这句没看明白,lz能否帮忙解释一下,谢谢.
讲的很容易理解。懂了,多谢指点!
【 在 MrWanted 的大作中提到: 】
: 先弄清楚一件事,x这个list里面放的是什么?是函数对象,还是函数的返回值?
: 在最后的循环里才真正的调用了list里的函数,而此时v已经指向value[1]了。