没有部分的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 Mercadofl[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函数列表的主要内容,如果未能解决你的问题,请参考以下文章