【问题标题】:Why my lambdas do not work? [duplicate]为什么我的 lambda 不起作用? [复制]
【发布时间】:2015-03-25 00:58:32
【问题描述】:

我很难让 lambda 工作。这里的代码是示例,但它很好地说明了我的问题。

lambdas = list()

for i in range(5):
    lambdas.append(lambda x:i*i*x)


print lambdas[0](1)
print lambdas[2](1)

这给了我 16,但我希望不同的 lambda 有不同的值。为什么会这样!

【问题讨论】:

  • “Python 中的作用域是词法的。闭包将永远记住变量的名称和作用域,而不是它指向的对象。” stackoverflow.com/questions/2295290/… 您的 lambda 捕获名称 i,而不是 i 引用的 对象值

标签: python python-3.x


【解决方案1】:

在这段代码中:

for i in range(5):
    lambdas.append(lambda x:i*i*x)

i的值是在函数运行时确定的。函数定义i的值丢失。

改用:

lambdas = list()

for i in range(5):
    lambdas.append(lambda x, i=i : i*i*x)  

print lambdas[0](1)
print lambdas[2](1)

这会产生:

0
4

这是因为,作为一种特殊情况,函数的默认参数(如上面的i=i)会立即绑定。

【讨论】:

  • 解释为什么它最初不起作用将使这是一个很好的答案。但我真的很喜欢默认参数即时绑定。
  • @Serdalis 好主意。已添加说明。
【解决方案2】:

i 在循环结束时为 4,因此对于每个 lambdai 为 4。

如果你在循环外打印i,你会看到它是4:

for i in range(5):
    lambdas.append(lambda x: i * i * x)

print(i)
4

您正在使用在整个循环中更新的变量,如果您在循环内调用 lambda,您将得到您所期望的。

for i in range(5):
    lambdas.append(lambda x: i * i * x)
    print(lambda x: i * i * x)(1)
0
1
4
9
16

行为如您所愿,i 只是一个变量,就像其他变量一样。

在旁注中,您可以使用列表组合来创建您的列表:

lambdas = [lambda x,i=i: i * i * x for i in xrange(5)]

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2013-06-20
    相关资源
    最近更新 更多