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双星号字典字典解包
:=海象表达式条件/循环中赋值

注意事项

  1. 左侧 ** 不能用于解包赋值(只能用 *
  2. 一个表达式中只能有一个 * 收集(但可有无星号变量)
  3. 海象运算符需要括号if (x := get()) > 0
  4. _ 是普通变量名,不是语法关键字(但约定为忽略)

核心记忆:* 管列表,** 管字典,:= 管复用