Python lambda不记得for循环中的参数

use*_*366 6 python lambda for-loop

可能重复:
使用lambda表达式中的变量值

我正在使用python并尝试隔离我使用lambda函数的问题.

从下面的代码我期望创建两个lambda函数,每个函数得到一个不同的x,输出应该是
1 2

但输出是2 2

为什么?我怎样才能创造两种不同的功能?使用def?

def main():
    d = {}
    for x in [1,2]:
        d[x] = lambda : print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

app*_*tor 16

lambda代码中的主体引用了名称x.与该名称关联的值在循环的下一次迭代中更改,因此当调用lambda并解析名称时,它将获取新值.

要获得预期的结果,将x循环中的值绑定到参数,lambda然后引用该参数,如下所示:

def main():
    d = {}
    for x in [1,2]:
        d[x] = lambda x=x: print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

>>> 
1
2
Run Code Online (Sandbox Code Playgroud)


Thi*_*One 5

这会修复它。这是因为 x 直接绑定到 lambda。

def create_lambda(x):
    return lambda : print(x)

def main():
    d = {}
    for x in [1,2]:
        d[x] = create_lambda(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)


Nik*_*nyh 5

看起来像是在工作partial

from functools import partial 
def main():
    d = {}
    for x in [1,2]:
        d[x] = partial(lambda x: print(x), x=x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

  • +1。执行此操作的简单方法是将其写为`d [x] = lambda x = x:print(x)`。但是,`partial`允许您锁定参数。最好将其写为d [x] = partial(print,x),因为print是一个函数。无需将其包装在lambda中。 (2认同)