为什么这种尝试创建咖喱函数列表的方法不起作用?
def p(x, num): print x, num def test(): a = [] for i in range(10): a.append(lambda x: p (i, x)) return a >>> myList = test() >>> test[0]('test') 9 test >>> test[5]('test') 9 test >>> test[9]('test') 9 test
这里发生了什么?
实际上执行我期望上述功能执行的功能是:
import functools def test2(): a = [] for i in range (10): a.append(functools.partial(p, i)) return a >>> a[0]('test') 0 test >>> a[5]('test') 5 test >>> a[9]('test') 9 test
在Python中,在循环和分支中创建的变量没有作用域。您创建的所有函数lambda都引用了相同的i变量,该变量9在循环的最后一次迭代中设置为。
lambda
i
9
解决方案是创建一个返回函数的函数,从而确定迭代器变量的范围。这就是该functools.partial()方法行之有效的原因。例如:
functools.partial()
def test(): def makefunc(i): return lambda x: p(i, x) a = [] for i in range(10): a.append(makefunc(i)) return a