* 和**有时展开,有时收集。*在对可迭代对象展开 **对字典展开。一般只看收集就够了,在函数定义的时候传入参数用
1. *
和 **
的两种语境
(1)函数调用 / 构造字面量 → 展开 (unpack)
在函数调用、列表/集合/字典的构造里,*
和 **
表示「把里面的东西拆开来」。
def f(x, y, z): passt = (1, 2, 3)
f(*t) # 拆开成 f(1, 2, 3)d = {"x": 10, "y": 20}
f(**d) # 拆开成 f(x=10, y=20)
(2)变量赋值 / 参数定义 → 收集 (pack)
在「接收」参数或「解构赋值」时,*
/ **
变成了「收集器」:
# 解构赋值
a, *b, c = [1, 2, 3, 4, 5]
# *b 收集中间的所有元素
print(a) # 1
print(b) # [2, 3, 4]
print(c) # 5# 参数定义
def g(x, *args, **kwargs):print("args:", args)print("kwargs:", kwargs)g(1, 2, 3, y=10, z=20)
# args 收集 (2, 3)
# kwargs 收集 {"y": 10, "z": 20}
所以:
调用 / 构造时 → 拆开(unpack)。
赋值 / 定义时 → 收集(pack)。