目前在学习Python中,不时的总结一些学习过程中遇到的一些问题。
在循环语句中使用Lambda表达式时需要注意一些潜在的问题,先看代码:
>>> def makeActions():
acts = []
for i in range(5): # Tries to remember each i
acts.append(lambda x: i ** x) # But all remember same last i!
return acts
>>> acts = makeActions()
>>> acts[0](2) # All are 4 ** 2, 4=value of last i
16
>>> acts[1](2) # This should be 1 ** 2 (1)
16
>>> acts[2](2) # This should be 2 ** 2 (4)
16
>>> acts[4](2) # Only this should be 4 ** 2 (16)
16
注意lambda表达式(lambda x: i ** x)在for循环语句中,lambda表达式引用循环变量i,但是结果所有的lambda表达式都引用了最后一个循环变量 i = 4,这是因为lambda表达式在执行的时候才会去寻找变量i,而这时所有的i变量已经都为4了。
要想解决这个问题,可以使用Lambda表达式的默认参数:
>>> def makeActions():
acts = []
for i in range(5): # Use defaults instead
acts.append(lambda x, i=i: i ** x) # Remember current i
return acts
>>> acts = makeActions()
>>> acts[0](2) # 0 ** 2
0
>>> acts[1](2) # 1 ** 2
1
>>> acts[2](2) # 2 ** 2
4
>>> acts[4](2) # 4 ** 2
16
这里使用了lambda表达式的默认参数(lambda x, i=i: i ** x)从而解决该问题。
学习内容来自《Learning Python, 5th Edition》