【问题标题】:Weird lambda behaviour in list comprehension [duplicate]列表理解中奇怪的 lambda 行为
【发布时间】:2013-03-26 17:27:22
【问题描述】:

我在列表理解中使用 lambda 函数,发现了一些奇怪的行为

x = [(lambda x: i) for i in range(3)]

print(x[0](0)) #print 2 instead of 0
print(x[1](0)) #print 2 instead of 1
print(x[2](0)) #print 2

有人可以解释为什么结果不是我所期望的吗?

【问题讨论】:

    标签: python python-3.x lambda list-comprehension


    【解决方案1】:

    lambdas 绑定变量本身,而不是它们拥有的值。 i 在列表解析的末尾更改为2,因此所有lambdas 都引用i,因此引用2。

    为避免这种情况,您可以使用 默认参数技巧

    [lambda x,i=i:i for i in range(3)]
    

    这将i 的值绑定到默认参数中(在函数定义时进行评估)。

    【讨论】:

    • +1 清晰简洁
    • [lambda x,j=i:j for i in range(3)] 会更清晰。
    • 如果你想使用 lambda 来定义一个函数,那么给它应用一个变量。尽管具有相同的符号,但 lambda 中的变量并不是 OP 认为的那样。所以这可能是 OP 想要的:[ (lambda a:a)(i) for i in range(3)]
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多