我见过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);
}
在迭代的每个步骤中都没有被评估?
答案 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
时进行评估。