跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

python解包赋值_利用星号表达式实现多变量赋值与元素交换技巧

星号表达式(*)是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 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载 立即学习 “ 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。

相关文章