【问题标题】:How to generate several functions using a for loop in Python? [duplicate]如何在 Python 中使用 for 循环生成多个函数? [复制]
【发布时间】:2017-12-17 03:25:38
【问题描述】:

我正在尝试使用 for 循环生成具有不同参数 i(见下文)的几个函数,但似乎所有这些函数都使用 i 的最后一项。谁能告诉我如何处理这个问题?

这是一个简化的示例。我实际上需要生成200多个不同参数的函数。

funs = ()
for i in range(2):
    f = lambda x: x+i
    funs += (f,)

那么事实证明这两个函数做的事情是一样的:

funs[0](1)

输出:2

funs[1](1)

输出:2

但我希望第一个函数给出的结果是 1 而不是 2。

非常感谢您。

【问题讨论】:

标签: python


【解决方案1】:

您必须打破与i 的动态绑定,例如将 2 个 lambda 封装在一起:

f = (lambda p : lambda x: x+p)(i)

这样,i 的值被捕获,并且函数保存i 的副本

另外:在附加到funs 时,出于性能原因,我不会使用tuple 创建列表(funs = () => funs = []

【讨论】:

    【解决方案2】:

    所有函数都得到相同结果的原因是因为i 不是 lambda 的本地变量,而是在外部范围内定义的,并且在调用 lambda 时访问它 - 而不是在调用时定义。在循环结束时,i 的值为 1,因此每次调用 lambda 函数时都使用 1。

    Jean-Francois Fabre 给出了一个很好的解决方案,但我个人更喜欢这个:

    list_ = []
    for i in range(2):
        f = lambda x, n=i: x+n
        list_.append(f)
    

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      相关资源
      最近更新 更多