一尘不染

这个python函数中的lambda表达式是怎么回事?

python

为什么这种尝试创建咖喱函数列表的方法不起作用?

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

阅读 347

收藏
2021-01-20

共1个答案

一尘不染

在Python中,在循环和分支中创建的变量没有作用域。您创建的所有函数lambda都引用了相同的i变量,该变量9在循环的最后一次迭代中设置为。

解决方案是创建一个返回函数的函数,从而确定迭代器变量的范围。这就是该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
2021-01-20