You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在lambda函数参数列表中使用*kwargs.values()会触发SyntaxError?

为什么Lambda参数列表后直接用*解包会报错,函数体内却正常?

问题场景

下面的lambda代码会触发SyntaxError,报错指向*运算符:

(lambda **kwargs: *kwargs.values())(a=1, b=2)

但在函数体内使用*解包kwargs.values()却完全正常:

(lambda *args, **kwargs: max(*args, *kwargs.values()))(1, 2, 3, a=4, b=5)

疑问:为何两种场景下*解包的合法性完全不同?


原因解析

核心是Python语法对*解包的使用场景有严格限制:

  1. lambda返回位置的限制
    lambda冒号后面的内容是「返回表达式」,而*解包不能作为独立的表达式存在。你不能直接写return *my_list(普通函数里也不行),同理lambda里也不能把*kwargs.values()作为单独的返回值——Python不允许这种写法,因为解包操作本身不是一个可返回的对象,它只是一种「展开序列」的语法糖,必须依附于特定上下文。

  2. 函数调用参数的合法场景
    第二个例子里的*kwargs.values()是在max()的参数列表中,这属于函数调用时的位置参数解包,是Python明确支持的语法:允许把可迭代对象解包为多个位置参数传给函数,所以完全合法。


修正第一个lambda的写法

如果想返回kwargs.values()解包后的内容,需要把它包装成合法的容器对象(比如元组、列表):

# 返回元组
(lambda **kwargs: tuple(kwargs.values()))(a=1, b=2)  # 输出(1, 2)
# 返回列表
(lambda **kwargs: [*kwargs.values()])(a=1, b=2)       # 输出[1, 2]

内容的提问来源于stack exchange,提问作者Zimzozaur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:42:44