当前位置: 首页 > 面试题库 >

如何创建Python Lambda列表(在列表理解/ for循环中)?

韦业
2023-03-14
问题内容

我想从Python中的常量列表创建lambda对象列表;例如:

listOfNumbers = [1,2,3,4,5]
square = lambda x: x * x
listOfLambdas = [lambda: square(i) for i in listOfNumbers]

但是,当我运行它们时,这将创建一个lambda对象列表:

for f in listOfLambdas:
    print f(),

我希望它会打印

1 4 9 16 25

而是打印:

25 25 25 25 25

似乎所有lambda都被赋予了错误的参数。我做错了什么,有办法解决吗?我认为我使用的是Python 2.4。

编辑:更多尝试的事情,例如这样:

listOfLambdas = []
for num in listOfNumbers:
    acthtml" target="_blank">ion = lambda: square(num)
    listOfLambdas.append(action)
    print action()

打印从1到25的期望平方,然后使用之前的print语句:

for f in listOfLambdas:
    print f(),

仍然给了我全部25。现有的lambda对象如何在这两个打印调用之间改变?

相关问题:为什么map()和列表理解的结果不同?


问题答案:

我猜想您在列表理解中创建的lambda绑定到变量i,最终变量i最终为5。因此,当您对事实进行评估后,lambda都绑定为5并最终计算25.在第二个示例中,num也发生了同样的事情。当您评估循环内的lambda时,num的值没有改变,因此您获得了正确的值。循环后,num为5

我不太确定您要做什么,所以不确定如何提出解决方案。这个怎么样?

def square(x): return lambda : x*x
listOfLambdas = [square(i) for i in [1,2,3,4,5]]
for f in listOfLambdas: print f()

这给了我预期的输出:

1
4
9
16
25

另一种思考方式是,lambda在创建时就“捕获”其词法环境。因此,如果您给它 num, 它直到被调用时才真正解析该值。这既混乱又强大。



 类似资料:
  • 问题内容: 我有两个清单如下 我想提取物项从当他们在: 如何将两个循环写为单行列表理解? 问题答案: 应该这样做:

  • 我正在尝试将POJO的jackson JSON字符串转换为JSON文件以导入MySQL。 我遇到的问题是,即使我在控制台中返回了JSON字符串,并且。json文件创建后,MySQL workbench抛出一个未处理的错误异常:bool()类型的对象没有长度 作为一个json文件,行为“true”。 如果我做文件被正确导入,但数据库中没有数据,如果被视为json,则只有一行。 我的POJO

  • 我有一个两个项目的列表,每个项目是一个文本字符串。我想围绕这两个项目循环,如果一个单词不在一组单词中,则基本上删除它。但是,下面的代码将所有单词放在一起,而不是创建两个单独的项。我希望我的更新列表包含两个项目,每个原始项目对应一个im更新:

  • 我正在尝试创建列表列表,其中大列表表示纸张包含小列表表示问题的集合,问题列表由问题字符串及其ID组成。在这里我的代码: 现在我没有错误地制作问题列表,但是当我尝试创建更大的列表时,Visual Studio无法将可变问题类型识别为类型,哪里错了?

  • 问题内容: 现在,我知道在迭代循环中修改列表是不安全的。但是,假设我有一个字符串列表,并且我想剥离字符串本身。可变值的替换是否算作修改? 问题答案: 它被认为是不良形式。如果需要保留对列表的现有引用,请改用列表理解和切片分配。

  • 我不熟悉java和springboot。我正在尝试使用springboot创建一个CRUD应用程序。我使用MySQL存储数据。 员工模式- 员工资源库- 员工控制员- 上面的控制器在JSON对象数组表单中给出了结果,如下所示 但我需要以下表格的回复 非常感谢你的帮助。