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