Unpacking (解包)
下面是 最完整、最实用、最通俗易懂的 Python “解包(unpacking)” 总结。
涵盖 列表/元组/字典/星号解包/双星号解包/嵌套解包/右侧解包/函数参数解包/高级技巧 等所有知识点。
Unpacking(解包)就是把容器里的元素“拆开”赋值给多个变量。
示例:
a, b, c = [1, 2, 3]
Python 会自动按顺序拆开,给到变量里。
元组解包
a, b = (1, 2)
列表解包
x, y, z = [10, 20, 30]
字符串也能解包
a, b, c = "abc"
用于“接收多个剩余元素”。
基本形式
a, *b = [1, 2, 3, 4]
# a = 1
# b = [2, 3, 4]
放在中间
a, *middle, c = [1, 2, 3, 4, 5]
# a=1, middle=[2,3,4], c=5
放在后面
*a, b = [1, 2, 3]
# a=[1,2], b=3
解开任意长度
first, *_, last = [1, 2, 3, 4, 5]
# _ 表示“我不用中间的值”
解包 dict —— keys 解包
a, b = {"x":1, "y":2}
# a='x', b='y'
传递字典参数给函数
def add(x, y):
return x + y
params = {"x": 10, "y": 20}
add(**params) # 等同于 add(x=10, y=20)
合并 dict
d1 = {"a": 1}
d2 = {"b": 2}
d3 = {**d1, **d2}
🔹 效果同 Python 3.9 的:
d3 = d1 | d2
Python 支持 递归式解包。
二维结构
(x1, y1), (x2, y2) = [(1, 2), (3, 4)]
混合解包
(a, (b, c)) = [1, (2, 3)]
嵌套 + 星号
(a, *b), c = ([1, 2, 3], 4)
# a=1, b=[2,3], c=4
Python 允许在赋值语句 右边使用星号:
vals = [*range(3), 99]
# vals = [0, 1, 2, 99]
拼接列表更优雅
a = [1, 2]
b = [3, 4]
c = [*a, *b] # [1,2,3,4]
*args 解包序列
def add(a, b, c):
return a + b + c
vals = [1, 2, 3]
add(*vals)
**kwargs 解包字典
def hello(name, age):
print(name, age)
d = {"name": "Tom", "age": 20}
hello(**d)
函数返回元组时,可直接解包:
def point():
return 3, 4
x, y = point()
遍历 tuple 列表
pairs = [(1,2), (3,4)]
for x, y in pairs:
print(x, y)
dict.items() 解包
for key, value in mydict.items():
...
打包 -> 解包
names = ["a", "b", "c"]
ages = [10, 20, 30]
for n, a in zip(names, ages):
print(n, a)
矩阵转置
matrix = [
[1, 2, 3],
[4, 5, 6],
]
transposed = list(zip(*matrix))
# [(1, 4), (2, 5), (3, 6)]
if (x := data.get("x")):
print(x)
甚至:
if (a, b := point()) : ...
❌ 元素数量不匹配
a, b = [1, 2, 3] # ValueError
✅ 使用星号避免错误
a, *b = [1, 2, 3]
| 特性 | 示例 | 用途 |
|---|---|---|
| 普通解包 | a, b = (1,2) |
拆序列 |
| 星号解包 (*) | a, *b = lst |
捕获任意个数 |
| 双星号解包 (**) | {**d1, **d2} |
dict 合并、参数传递 |
| 嵌套解包 | (a,(b,c))=… |
多维结构 |
| 右侧解包 | lst = [*a,*b] |
构建列表 |
| 参数解包 | f(*args) f(**kwargs) |
函数灵活调用 |
Python 的解包让数据处理变得:
- 简洁
- 高效
- 可读
- 灵活
是 Pythonic 风格的重要组成部分。