我正在运行Python 3.4.2,我对代码的行为感到困惑。我正在尝试创建递增次数的可调用多项式函数列表:
bases = [lambda x: x**i for i in range(3)]
但是出于某种原因,它这样做:
print([b(5) for b in bases])
# [25, 25, 25]
为什么bases
似乎在列表理解中重复了最后一个lambda表达式的列表?
这个问题是经典的“陷阱”,是在lambda函数被调用之前,不会查找i
lambda函数中引用的内容。当时的值是结束时绑定到的最后一个值,即。i``for-loop``2
如果绑定i
到lambda
函数定义中的默认值,则每个函数都i
将成为局部变量,并且在 定义
而不是调用lambda时,将评估其默认值并将其绑定到该函数。
因此,当调用lambda时,i
现在在 本地范围内 查找,并使用其默认值:
In [177]: bases = [lambda x, i=i: x**i for i in range(3)]
In [178]: print([b(5) for b in bases])
[1, 5, 25]
以供参考:
问题内容: 从我的Python控制台 为什么在最后打印出三个都不打印? 问题答案: 列表理解不是当前工作的正确工具。它将始终返回一个 list ,并且给定的结果为,该列表将填充值。当我们对创建值列表不感兴趣时,仅对不返回值的函数求值时,简单的循环会更好:
问题内容: 使Java脚本执行 类似 Python的列表理解的最干净的方法是什么? 在Python中,如果我有一个对象列表,我要“拉出”我的名字,我会这样做… 在javascript中,除了仅使用for循环结构外,我没有真正看到一种更“美丽”的方式。 仅供参考:我使用的是jQuery;也许它具有一些漂亮的功能使之成为可能? 更具体地说,假设我使用一个jQuery选择器来获取所有元素,那么我将如何
首先,我有下面的发票清单。每个列表对象都有一个零件号、一个描述、数量和一个价格。 我将其映射到数量上,并将其排序到数量上,得到以下结果: 但是我如何在上进行映射,以便在我的结果中显示在所显示的数量前面?我不能这样做:
问题内容: 在Java 8中,类的lambda似乎保留在数组中。例如,假设我们有此类: 然后像这样打印出来: 输出将是这样的 所以我们可以在这里看到两件事。调用两次的同一个lambda会为我们提供相同的lambda对象(这与匿名内部类不同,在匿名内部类中我们每次都可以获取一个新的lambda对象)。我们还看到它们看起来像是被保存在类中的某种“ Lambda”结构中 我的问题是,我可以在课堂上掌握l
问题内容: 假设我有一个这样的列表: 要获得打印的值及其索引,我可以使用Python的函数,如下所示 现在,当我尝试在A中使用它时,出现了这个错误 所以,我的问题是:在列表理解中使用枚举的正确方法是什么? 问题答案: 尝试这个: 您需要放入一个元组以使列表理解起作用。另外,鉴于 已经 返回一个元组,您可以直接将其返回而无需先拆包: 无论哪种方式,返回的结果都是预期的:
问题内容: 伙计们 我正在尝试找到问题的最优雅解决方案,并且想知道python是否为我想做的事情内置了任何东西。 我正在做的是这个。我有一个列表,并且我有一个接受项目并返回列表的函数。我可以使用列表推导来转换所有内容,例如: 但这返回一个列表列表; 我真正想要的是获取扁平化的列表; 现在,其他语言也有它。传统上用函数式编程语言来称呼它,而.Net称它为。python有类似的东西吗?有没有一种巧妙的