【发布时间】:2012-10-11 12:45:13
【问题描述】:
考虑这个例子
def dump(value):
print value
items = []
for i in range(0, 2):
items.append(lambda: dump(i))
for item in items:
item()
输出:
1
1
我怎样才能得到:
0
1
【问题讨论】:
考虑这个例子
def dump(value):
print value
items = []
for i in range(0, 2):
items.append(lambda: dump(i))
for item in items:
item()
输出:
1
1
我怎样才能得到:
0
1
【问题讨论】:
您可以在 lambda 上使用具有默认值的参数:
for i in range(0, 2):
items.append(lambda i=i: dump(i))
这是因为默认值是在定义函数时计算的,而不是在调用时计算的。
【讨论】:
你可以使用:
for i in range(0, 2):
items.append(lambda i=i: dump(i))
捕获i的当前值
这是因为默认参数值是在函数创建时评估的,i 不是外部变量,而是一个函数参数,它将具有您想要的默认值。
更详细的解释可以在这个answer找到。
【讨论】:
为了完整起见,您还可以这样做:
for i in range(0, 2):
items.append((lambda i: lambda: dump(i))(i))
【讨论】:
输出值是 i 在函数求值时的值,而不是在函数声明时的值。这就是为什么你没有得到想要的结果。
【讨论】: