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

发布于 2021-01-29 14:10:47

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

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
关注者
0
被浏览
95
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看