Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Unpacking (解包)

下面是 最完整、最实用、最通俗易懂的 Python “解包(unpacking)” 总结。

涵盖 列表/元组/字典/星号解包/双星号解包/嵌套解包/右侧解包/函数参数解包/高级技巧 等所有知识点。

🚀 什么是 unpacking?

Unpacking(解包)就是把容器里的元素“拆开”赋值给多个变量。

示例:

a, b, c = [1, 2, 3]

Python 会自动按顺序拆开,给到变量里。

1. 基础解包(元组、列表)

元组解包

a, b = (1, 2)

列表解包

x, y, z = [10, 20, 30]

字符串也能解包

a, b, c = "abc"

2. 星号解包(*)– 重点

用于“接收多个剩余元素”。

基本形式

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]
# _ 表示“我不用中间的值”

3. 双星号解包(**)用于字典

解包 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

4. 嵌套解包

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

5. 右侧解包(Python 3.8+ 新特性)

Python 允许在赋值语句 右边使用星号

vals = [*range(3), 99]
# vals = [0, 1, 2, 99]

拼接列表更优雅

a = [1, 2]
b = [3, 4]
c = [*a, *b]  # [1,2,3,4]

6. 函数参数解包

*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)

7. 函数返回值的解包

函数返回元组时,可直接解包:

def point():
    return 3, 4

x, y = point()

8. 循环中的解包

遍历 tuple 列表

pairs = [(1,2), (3,4)]
for x, y in pairs:
    print(x, y)

dict.items() 解包

for key, value in mydict.items():
    ...

9. 高级技巧:多个列表同步迭代(zip 解包)

打包 -> 解包

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)]

10. 解包 + 赋值表达式(:=)

if (x := data.get("x")):
    print(x)

甚至:

if (a, b := point()) : ...

11. 解包常见错误与陷阱

❌ 元素数量不匹配

a, b = [1, 2, 3]   # ValueError

✅ 使用星号避免错误

a, *b = [1, 2, 3]

总结:Python Unpacking 的精髓

特性 示例 用途
普通解包 a, b = (1,2) 拆序列
星号解包 (*) a, *b = lst 捕获任意个数
双星号解包 (**) {**d1, **d2} dict 合并、参数传递
嵌套解包 (a,(b,c))=… 多维结构
右侧解包 lst = [*a,*b] 构建列表
参数解包 f(*args) f(**kwargs) 函数灵活调用

Python 的解包让数据处理变得:

  • 简洁
  • 高效
  • 可读
  • 灵活

是 Pythonic 风格的重要组成部分。