没有部分的python lambda函数列表

Posted

技术标签:

【中文标题】没有部分的python lambda函数列表【英文标题】:list of python lambda functions w/o partial 【发布时间】:2011-09-14 22:56:53 【问题描述】:

我一直在尝试使用列表推导在 python 中生成一个 lambda 函数列表。但是没用,

例如

fl=[lambda x: x**i for i in range(5)]

我检查了另一个问题,它基本上根据i的参考生成相同的功能。

所以我也尝试了部分。

from functools import partial

fl=[partial(lambda x: x**i) for i in range(5)]

但它也没有用。任何帮助将不胜感激。干杯~

【问题讨论】:

@Jeff Mercado fl[0](2) = fl[1](2) = 16 嗯,这是一个谜题。我认为没有办法阻止 i 被更新,因为它是对循环变量的引用。为什么要创建这个函数列表?是否可以使用不同的方法来解决您更大的问题? 【参考方案1】:

You're tripping over Python scopes.

fl=[lambda x, i=i: x**i for i in range(5)]

【讨论】:

有趣。所以在这种情况下,Python 的行为似乎与 javascript 相似。 这实际上与范围界定无关。这是由“关闭外部范围的变量”的解释方式引起的(Python选择共享相同的变量而不是复制它的值),这确实是许多其他语言(例如JS和C#) 工作。 它与范围界定有关。每个 lambda 具有相同的范围,这意味着它们都具有相同的变量。如果变量发生变化,所有 lambda 的结果也会发生变化。将该值作为默认参数分配给 lambda 意味着它们不再需要访问(甚至坚持)外部范围。 每个 lambda 都有自己的作用域。这些作用域在定义时不包括i 值的副本(与默认值一样),因此它们在运行时从封闭作用域访问该值。他们这样做是因为它被定义为不应该成为本地副本,这可能被认为是一个范围决定,但这并不是因为他们没有自己的范围。 “shares”在我的评论中可能比“has”更好用,但我坚持我的回答。【参考方案2】:

您实际上是按名称传递了i

fl=[lambda x: x**i for i in range(5)]

每次执行lambda 时,它都会将相同的i 绑定到函数,因此当函数(稍后)执行时,它使用i 的当前值(将是4)。您应该将其作为默认参数传递:

fl=[lambda x, j=i: x**j for i in range(5)]

实际上,我注意到您误用了partial。这里:

fl = [partial(lambda x, y: y ** x, i) for i in range(5)]

这也有效。

【讨论】:

@jerry,是的,我刚刚使用了j,因为它可以更清楚地了解正在发生的事情(无论如何)。【参考方案3】:

另一种常见的解决方法是使用闭包:

def create_f(i):
    def f(x):
        return x**i
    return f

fl = [create_f(i) for i in range(5)]

【讨论】:

以上是关于没有部分的python lambda函数列表的主要内容,如果未能解决你的问题,请参考以下文章

Java8部分新特性的学习

Java8部分新特性的学习

Tkinter lambda 函数

Python:lambda表达式的两种应用场景

lambda表达式由啥组成

映射函数或 lambda 在 Python 中无法按预期工作