为何在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语法对*解包的使用场景有严格限制:
lambda返回位置的限制
lambda冒号后面的内容是「返回表达式」,而*解包不能作为独立的表达式存在。你不能直接写return *my_list(普通函数里也不行),同理lambda里也不能把*kwargs.values()作为单独的返回值——Python不允许这种写法,因为解包操作本身不是一个可返回的对象,它只是一种「展开序列」的语法糖,必须依附于特定上下文。函数调用参数的合法场景
第二个例子里的*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
相关产品推荐
相关产品推荐

