【问题标题】:lambda in python reference mind puzzlepython参考心智谜题中的lambda
【发布时间】:2012-10-11 12:45:13
【问题描述】:

考虑这个例子

def dump(value):
    print value

items = []    
for i in range(0, 2):
    items.append(lambda: dump(i))

for item in items:
    item()

输出:

1
1

我怎样才能得到:

0
1

【问题讨论】:

    标签: python reference lambda


    【解决方案1】:

    您可以在 lambda 上使用具有默认值的参数:

    for i in range(0, 2):
        items.append(lambda i=i: dump(i))
    

    这是因为默认值是在定义函数时计算的,而不是在调用时计算的。

    【讨论】:

    • 伙计,你很聪明。这是示例,但您找到了解决方法,关键是如何在 lambda 定义上评估该引用。有没有办法做到这一点?
    【解决方案2】:

    你可以使用:

    for i in range(0, 2):
        items.append(lambda i=i: dump(i))
    

    捕获i的当前值

    这是因为默认参数值是在函数创建时评估的,i 不是外部变量,而是一个函数参数,它将具有您想要的默认值。

    更详细的解释可以在这个answer找到。

    【讨论】:

      【解决方案3】:

      为了完整起见,您还可以这样做:

      for i in range(0, 2):
          items.append((lambda i: lambda: dump(i))(i))
      

      【讨论】:

      • 我觉得这个答案是最简单的,尽管它比默认值答案更冗长。
      【解决方案4】:

      输出值是 i 在函数求值时的值,而不是在函数声明时的值。这就是为什么你没有得到想要的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        相关资源
        最近更新 更多