I understand functional programming well. I want to create a list of functions that each selects a different element of a list. I have reduced my problem to a simple example. Surely this is a Python bug:
fun_list = []
for i in range(5):
def fun(e):
return e[i]
fun_list.append(fun)
mylist = range(10)
print([f(mylist) for f in fun_list])
"Obviously" it should return [0,1,2,3,4].
It however returns [4, 4, 4, 4, 4]. How can I coerce Python to do the right thing? (Hasn't this been noticed before? Or am I just being thick?)
This is Python 3.4.0 (default, Mar 25 2014, 11:07:05)
Thanks,
David
解决方案How can I coerce Python to do the right thing?
Here is one approach:
fun_list = []
for i in range(5):
def fun(e, _ndx=i):
return e[_ndx]
fun_list.append(fun)
mylist = range(10)
print([f(mylist) for f in fun_list])
This works because the default value for _ndx is evaluated and saved when the def statement for fun is executed. (In python, def statements are executed.)