为何Python中单独使用starred target赋值报错,带方括号则可行?
为什么单独使用
*a赋值会报错? 这本质是Python赋值语句的语法规则限制——星号目标(starred target)不能单独作为赋值的顶层目标,它必须嵌套在列表、元组这类支持解包的结构里才能生效。
具体分析两种情况:
*a=1,2,3:这里的赋值目标是单独的*a,不符合Python对赋值目标的语法定义。Python规定,赋值目标要么是单个变量名,要么是带结构的解包容器(比如列表、元组的括号包裹形式),单独的*a不属于合法的目标类型,所以触发语法错误。[*a] = 1,2,3:这里的赋值目标是一个列表结构,*a作为列表内的星号目标,属于可迭代解包赋值的合法场景。此时Python会把右侧可迭代对象的所有元素收集到a里(因为列表里只有*a这一个目标),最终a会被赋值为[1,2,3]。
补充验证
你也可以试试用元组结构包裹星号目标,同样能正常运行:
(*a,) = 1,2,3 # 注意逗号不能少,否则会被解析成表达式而非元组目标
这时候a同样会被赋值为[1,2,3],原理和列表包裹的情况一致——星号目标必须处于解包容器的上下文中,才能发挥收集元素的作用。
内容的提问来源于stack exchange,提问作者novice
相关产品推荐
相关产品推荐

