python中的lambdas列表

时间:2016-07-16 01:45:00

标签: python list lambda

我见过this question,但我仍然无法理解为什么这样简单的例子不起作用:

[(y, y) for y in mylist]

与以下内容有何不同:

y

为什么public static async Task SpeakTextAsync(string text, MediaElement mediaElement) { IRandomAccessStream stream = await this.SynthesizeTextToSpeechAsync(text); await mediaElement.PlayStreamAsync(stream, true); } 在迭代的每个步骤中都没有被评估?

2 个答案:

答案 0 :(得分:4)

#myisam-recover = BACKUP #key_buffer = 16M 表达式正文中的y只是一个名称,与您用于迭代lambda的{​​{1}}无关。作为一个自由变量,在你实际调用函数之前找不到y的值,此时它使用调用范围内mylist的任何值。

要实际强制y在定义时具有值,您需要通过参数将其设置为正文:

y

答案 1 :(得分:2)

((y, lambda x: x==str(y)) for y in mylist)
lambda中的

y在定义的genration表达式时没有绑定,但是当它被调用时它被绑定;当它被调用时,迭代已经完成,因此y引用最后一项greta

解决此问题的一种方法是使用关键字参数,该参数在定义函数/ lambda时进行评估:

funcdict = dict((y, lambda x, y=y: x == y) for y in mylist)
funcdict = {y: lambda x, y=y: x == y for y in mylist}  # dict-comprehension

或者您可以使用partial

funcdict = {y: partial(operator.eq, y) for y in mylist}

y在迭代mylist时进行评估。