星号表达式(*)是Python中明确的结构匹配操作符,仅合法用于赋值语句左侧,且每层只能出现一次、须与其他变量共存于同级序列中,不支持嵌套或跨层级解包。

星号表达式(*)在 Python 解包赋值中不是语法糖,而是明确的结构匹配操作符;它只在赋值语句左侧(target list)中合法,不能用在右侧或函数调用里当“万能参数”混用。
星号解包必须出现在赋值左侧且只能有一个
Python 规定:带 * 的变量在解包赋值中只能出现一次,且必须和其他变量共存于同一级序列结构中。单独写 *rest = [1, 2, 3] 是语法错误。
-
a, *b, c = [1, 2, 3, 4]✅ ——b得到[2, 3] -
*x, *y = [1, 2]❌ —— SyntaxError: two starred expressions in assignment -
*z = [1, 2, 3]❌ —— SyntaxError: starred assignment target must be in a list or tuple
嵌套结构里星号不能跨层级解包
* 只作用于当前层的可迭代对象,不会递归展开嵌套。想取内层首尾元素,得先解出容器再二次解包。
-
data = [1, [2, 3, 4], 5],a, *mid, c = data→mid是[[2, 3, 4]],不是[2, 3, 4] - 要拿到内层数字:先
_, inner, _ = data,再x, *y, z = inner - 试图写
a, *[b, *c, d], e = data❌ —— 嵌套星号不被支持
交换变量时星号解包不如传统元组交换简洁
用 * 实现交换(如 a, *_, b = b, *rest, a)逻辑绕、可读差,还容易因长度不匹配崩溃;标准交换应优先用元组。
立即学习“Python免费学习笔记(深入)”;
-
a, b = b, a✅ —— 简洁、高效、无副作用 -
lst = [1, 2, 3, 4]; lst[0], lst[-1] = lst[-1], lst[0]✅ —— 原地交换两个索引 -
*x, y = lst; *z, w = [w, *x, y]❌ —— 故意绕路,且w未定义就引用
真正需要星号解包的典型场景是处理长度不确定的输入,比如日志行切分、API 返回字段提取、函数参数预处理;它本质是模式匹配工具,不是通用赋值增强器。别为了“炫技”在固定长度结构里硬塞 *,那只会让代码更难 debug。











