元组解包要求变量数与元素数严格一致,否则报ValueError;可用捕获剩余项,但只能出现一次且不能在普通变量右侧;列表传参需用*展开;嵌套结构解包需注意类型和层级。

元组解包时变量数量不匹配会直接报错
Python 解包本质是按位置一一对应赋值,tuple 或 list 元素个数必须和左边变量数量严格一致,否则抛出 ValueError: too many values to unpack 或 not enough values to unpack。
常见场景:从函数返回多个值、读取 CSV 行、解析 API 响应。比如 def get_user(): return "Alice", 28, "alice@example.com",写成 name, age = get_user() 就会崩——明明返回 3 个值,只写了 2 个变量。
- 用
*捕获剩余项:例如name, *rest = get_user()→name="Alice",rest=["28", "alice@example.com"] - 确保函数文档或类型提示标明返回长度,别靠猜
- 如果不确定长度,先用
len()或isinstance(..., (tuple, list))做兜底判断,再解包
列表解包不能直接用于函数调用参数传递
很多人想把 my_list = [1, 2, 3] 直接当参数传给 print(a, b, c),但写成 print(my_list) 只会输出一个列表对象;而 print(my_list[0], my_list[1], my_list[2]) 又太啰嗦。
正确做法是用 * 运算符“展开”列表,让每个元素变成独立实参。这是语法层面的支持,不是函数内部逻辑。
立即学习“Python免费学习笔记(深入)”;
-
print(*my_list)等价于print(1, 2, 3) - 注意:只能在函数调用、字面量构造(如
[*a, *b])、赋值语句中使用*,不能单独写*my_list当表达式 - 嵌套结构里
*不递归展开:*[[1,2], [3,4]]得到两个子列表,不是四个数字
带星号的解包变量不能放在位置参数之后
在赋值语句中,带 * 的变量(如 *middle)必须是唯一一个“可变长接收者”,且不能出现在其他普通变量右边。
错误写法:a, *b, c, d = [1, 2, 3, 4, 5] —— Python 会报 SyntaxError: two starred expressions in assignment,因为 c, d 在 *b 后面,解释器无法确定怎么切分。
- 合法顺序只有三种:全普通变量、
*star在中间、*star在末尾(如a, b, *rest) - 想取头尾固定几个 + 中间全部,就用
a, b, *middle, x, y = seq,但前提是seq长度 ≥ 左边非星变量总数 - 如果序列长度不够,依然会触发
ValueError,和有没有*无关
解包嵌套结构时容易忽略层级和类型一致性
从 JSON 或数据库查出的数据常是嵌套的 list 或 dict,比如 data = [("Alice", {"age": 28}), ("Bob", {"age": 31})],有人直接写 for name, age in data: 就会出错——第二项是 dict,不是单个值。
这时候需要继续解包,但得确认子结构类型。盲目用 name, {"age": age} 是非法语法;正确方式是先解出字典再取键,或用更明确的模式。
- 安全做法:
for name, info in data: age = info["age"] - 如果确定每项都是二元元组且第二个元素是字典,可用
for name, info_dict in data: age = info_dict["age"] - 避免在循环里混用不同结构,比如有的项是
{"age": 28},有的是[28],解包前先统一处理或加isinstance判断










