(lambda **kwargs: *kwargs.values())(a=1, b=2)
此代码片段引发 SyntaxError,特别指出“无效语法”,指出在 lambda 函数的参数列表中使用 * 运算符。但是,我注意到使用 * 运算符从 kwargs 中解压值在函数体内工作得非常好,如以下 lambda 表达式所示:
python (lambda *args, **kwargs: max(*args, *kwargs.values()))(1, 2, 3, a=4, b=5)
在这种情况下,kwargs.values() 在函数体内使用 * 解包,没有任何问题。
我很好奇为什么会出现这种行为。为什么在 lambda 函数的参数列表中使用 *kwargs.values() 会导致语法错误,而在函数体内使用它却没有任何问题?
任何见解或解释将不胜感激。谢谢!
在 second 示例中,
*kwargs.values()
将 kwargs.values()
扩展为 max
函数的各个参数,它在概念上等同于
d = {'a': 1, 'b': 2}
vals = list(d)
max(val[0], vals[1])
在first示例中,解压没有任何意义,相当于
>>> def f(**kwargs):
... *kwargs.values()
...
File "<stdin>", line 2
SyntaxError: can't use starred expression here