Skip to content

嵌套拆包完全指南

从简单到复杂,全面理解 Python 的解包赋值语法。


一、基本解包(单层)

语法

Python
a, b = (1, 2)
Click Run to see output

完全形式

Python
(变量1, 变量2, ...) = (值1, 值2, ...)
Click Run to see output

等号右侧可以是任意可迭代对象

Python
a, b = [1, 2]      # 列表
a, b = "xy"        # 字符串
a, b, c = range(3) # range 对象
Click Run to see output

二、多层嵌套解包

语法

Python
(a, b), (c, d) = ((1, 2), (3, 4))
Click Run to see output

完全形式

Python
(外层变量1, 外层变量2), (外层变量3, 外层变量4) = 嵌套元组
Click Run to see output

核心规则

规则说明
层级对应左侧有几个 (...),右侧就有几个嵌套层级
数量匹配每层括号内的变量数 = 该层元组的元素数
递归展开从最外层往里拆,每层都是独立解包

三、实际案例

案例 1:MNIST 数据加载

Python
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
Click Run to see output

展开过程:

mnist.load_data()

((train_images, train_labels), (test_images, test_labels))  ← 嵌套元组
    ↓ 第一层拆包
train_set = (train_images, train_labels)   → 第1个元素
test_set  = (test_images, test_labels)     → 第2个元素
    ↓ 第二层拆包
train_images, train_labels = train_set
test_images, test_labels  = test_set

案例 2:坐标点列表

Python
(point1, point2), (point3, point4) = ((1, 2), (3, 4))
# point1 = 1, point2 = 2, point3 = 3, point4 = 4
Click Run to see output

案例 3:函数返回嵌套数据

Python
def get_user_group():
    return ("Alice", "admin"), ("Bob", "viewer")

(user1_name, user1_role), (user2_name, user2_role) = get_user_group()
# user1_name = "Alice", user1_role = "admin"
# user2_name = "Bob", user2_role = "viewer"
Click Run to see output

四、完全语法形式

完整 BNF 范式

Python
目标表达式 := 变量 | (目标表达式, 目标表达式, ...)
赋值 := 目标表达式 = 可迭代对象
Click Run to see output

简化理解:

左边是几层括号,右边就有几层元组
每层括号里的变量数 = 对应层级的元素数

任意深度嵌套

Python
# 三层嵌套
(a, (b, c)), (d, e) = ((1, (2, 3)), (4, 5))
# a=1, b=2, c=3, d=4, e=5
Click Run to see output

五、常见错误

数量不匹配

Python
# ❌ 错误:左侧需要3个变量,右侧只有2个元素
a, b, c = (1, 2)

# ✅ 正确
a, b = (1, 2)
Click Run to see output

嵌套层级不匹配

Python
# ❌ 错误:左侧2层,右侧只有1层
(a, b), c = (1, 2, 3)

# ✅ 正确
a, b, c = (1, 2, 3)
Click Run to see output

六、星号解包(扩展)

剩余值收集

Python
first, *middle, last = [1, 2, 3, 4, 5]
# first = 1, middle = [2, 3, 4], last = 5
Click Run to see output

嵌套中用星号

Python
(a, *rest), b = ([1, 2, 3], 4)
# a = [1, 2, 3], rest = [2, 3], b = 4
Click Run to see output

七、速查表

场景语法示例
基本解包a, b = iterablea, b = [1, 2]
嵌套解包(a, b), (c, d) = nested(a, b), (c, d) = ((1, 2), (3, 4))
丢弃不需要的值a, _, c = ...a, _, c = (1, 99, 3)
星号收集a, *rest = ...a, *rest = [1, 2, 3, 4]
嵌套+星号(a, *rest), b = ...(a, *rest), b = ([1, 2, 3], 4)

八、拆包在 Python 中的应用场景

场景示例
函数返回多个值x, y = divmod(10, 3)
循环解包for k, v in dict.items():
交换变量a, b = b, a
解析配置host, port, *rest = args
数据处理(train, val), test = split_data(data)

总结:嵌套拆包的核心就是「层级对应,数量匹配」,有几层括号就有几层元组。