Python
Python 解包与赋值语法完全指南
Python 解包与赋值语法完全指南
一文掌握 Python 中所有赋值和解包相关语法
一、基础赋值
# 链式赋值
a = b = c = 0
# 元组解包(基础)
x, y = 1, 2
# 交换变量
a, b = b, a二、星号解包 *
| 场景 | 语法 | 结果 |
|---|---|---|
| 收集剩余 | first, *rest = [1,2,3,4] | first=1, rest=[2,3,4] |
| 收集中间 | first, *mid, last = [1,2,3,4,5] | first=1, mid=[2,3,4], last=5 |
| 忽略中间 | a, *_, c = [1,2,3,4] | a=1, c=4 |
| 合并列表 | [*a, *b] | 列表拼接 |
| 函数展开 | func(*[1,2,3]) | 位置参数展开 |
三、双星号解包 **
| 场景 | 语法 | 结果 |
|---|---|---|
| 合并字典 | {**d1, **d2} | 字典合并 |
| 函数展开 | func(**{"a":1, "b":2}) | 关键字参数展开 |
| 参数收集 | def f(**kwargs): | 收集关键字参数 |
四、函数参数(结合使用)
def func(a, b, *args, **kwargs):
# a, b: 普通参数
# args: 额外位置参数(元组)
# kwargs: 额外关键字参数(字典)
pass
# 调用时展开
func(1, 2, *[3,4], **{"x":10, "y":20})五、嵌套解包
# 嵌套结构解包
(a, b), (c, d) = [(1,2), (3,4)]
# 混合使用
(a, *b), (c, d, *e) = [(1,2,3), (4,5,6,7)]六、海象运算符 :=(Python 3.8+)
# 赋值即表达式
if (n := len(data)) > 10:
print(f"长度 {n}")
# 列表推导中复用
[y for x in range(10) if (y := x**2) > 5]七、特殊语法
占位符 _
_, _, c = (1,2,3) # c=3,忽略前两个
a, *_, b = [1,2,3,4,5] # a=1, b=5
for _ in range(5): pass # 忽略循环变量切片赋值
arr[1:3] = [10,20] # 替换
arr[1:1] = [10,20] # 插入
arr[1:3] = [] # 删除八、可解包对象
class Point:
def __iter__(self):
yield self.x
yield self.y
p = Point(3, 4)
x, y = p # 自动解包快速对照表
| 语法 | 左侧 | 右侧 | 适用对象 |
|---|---|---|---|
a, b = ... | 多变量 | 元组/列表/任何可迭代 | 等长解包 |
*rest | 一个星号 | 可迭代 | 收集剩余元素 |
**kwargs | 双星号 | 字典 | 字典解包 |
:= | 海象 | 表达式 | 条件/循环中赋值 |
注意事项
- 左侧
**不能用于解包赋值(只能用*) - 一个表达式中只能有一个
*收集(但可有无星号变量) - 海象运算符需要括号:
if (x := get()) > 0 _是普通变量名,不是语法关键字(但约定为忽略)
核心记忆:* 管列表,** 管字典,:= 管复用