为何在赋值语句左侧的元组解包中无法使用多个*变量?
为什么Python赋值语句中不允许多个星号表达式?
首先得搞清楚赋值里星号表达式的核心机制:它的作用是捕获序列中没被其他变量精准匹配的连续剩余元素,把这些元素打包成一个列表(不管原序列是什么类型,星号变量最终都是列表)。
比如你写的合法例子:
a, b, *c, d = [1,2,3,4,5,6,7,8,9,10]
这里的匹配逻辑非常清晰:
a拿序列的第一个元素1b拿第二个元素2d拿最后一个元素10- 剩下的中间连续元素
[3,4,5,6,7,8,9]全部归c
但如果写成*a, b, *c, d,问题就来了:Python完全不知道该怎么分割剩余元素给a和c。举个简单的例子,假设序列是[1,2,3,4],那a可以是[1]、c是[3],也可以a是空列表、c是[1,3],甚至a是[1,2]、c是空——这种歧义是编程语言语法设计要绝对避免的,因为语言需要明确、无歧义的规则,不能让编译器/解释器猜你的意图。
另外要区分开函数中的*args:函数定义里的*args是收集所有未被命名的位置参数,本质是“把剩下的所有参数打包”,不存在拆分的问题,所以可以正常使用。但赋值场景是解构序列,需要把序列的元素逐个分配给变量,这时候如果有多个星号变量,就打破了“剩余元素是连续且唯一”的规则。
总结一下:赋值中的星号表达式是用来承接“唯一的连续剩余部分”,多个星号变量会导致匹配规则模糊,无法确定各自的元素范围,所以Python语法直接禁止了这种写法。
内容的提问来源于stack exchange,提问作者amiref
相关产品推荐
相关产品推荐

