为了使Lambda记住的值m,可以使用具有默认值的参数:[x() for x in [lambda m=m: m for m in [1,2,3]]]# [1, 2, 3]之所以可行,是因为默认值在定义时设置一次。现在,每个lambda都会使用自己的默认值,m而不是m在lambda执行时在外部范围中查找的值。
长话短说,您不想这样做。更具体地说,您遇到的是操作顺序问题。您正在创建lambda全部返回的三个单独的m,但是没有一个立即被调用。然后,当您到达外部列表理解时,它们都被称为的残差值为m3,即内部列表理解的最后一个值。-评论->>> [lambda: m for m in range(3)][<function <lambda> at 0x021EA230>, <function <lambda> at 0x021EA1F0>, <function <lambda> at 0x021EA270>]那是三个单独的lambda。并且,作为进一步的证据:>>> [id(m) for m in [lambda: m for m in range(3)]][35563248, 35563184, 35563312]同样,三个单独的ID。