如果你定义如下一个python的lambda 函数:
------------------------------
def doLambda(val):
print "value 2:", val
commands = []
for value in range(5):
print "value 1:", value
commands.append(lambda:doLambda(value))
for c in commands:
c()
------------------------------
当你调用的时候却发现:doLambda 的value 总是4 ,如下:
>>>
value 1: 0
value 1: 1
value 1: 2
value 1: 3
value 1: 4
value 2: 4
value 2: 4
value 2: 4
value 2: 4
value 2: 4
正确的方式应该如下:
-------------------------------
def wrapper(val):
def inner():
print "value 2:", val
return inner
commands = []
for value in range(5):
print "value 1:", value
commands.append(wrapper(value))
for c in commands:
c()
-------------------------------
>>>
value 1: 0
value 1: 1
value 1: 2
value 1: 3
value 1: 4
value 2: 0
value 2: 1
value 2: 2
value 2: 3
value 2: 4
或者:
-----------------------------------
######
>>> commands = []
>>> def sayNumber(n):
... print n
...
>>> for i in range(5):
... commands.append((lambda v: lambda: sayNumber(v))(i))
...
>>>
>>> for c in commands:
... c()
...
0
1
2
3
4
######
-----------------------------------