【Python 语法糖小火锅 · 第 2 涮】
一、糖味一句话
星号 * 和 ** 就是 Python 的「拆包神器」:
把序列/字典“哗”地倒出来,再“嗖”地装进变量或函数,一次到位,不洒不漏。
二、1 行示例 3 连发
# ① 序列拆包:头尾随便抓
head, *body, tail = range(5) # head=0, body=[1,2,3], tail=4# ② 字典合并:两份配置一张表
merged = {**defaults, **user_cfg} # 后者覆盖前者# ③ 星号形参:任意长度位置 & 关键字
def log(fmt, *args, **kw):print(fmt.format(*args), kw) # kw 记录额外字段
三、真实场景:函数调用一键展开
需求:把 query_params
字典直接塞进 requests.get()
,同时再补一个默认 timeout=3
。
import requests
query_params = {'q': 'python', 'page': 2}
resp = requests.get('https://api.github.com/search/repositories',params={**query_params, 'per_page': 10},timeout=3)
解释:
{**query_params, 'per_page': 10}
先把原字典“倒空”,再加新键。- 无需手动
copy()
,也不会修改原字典。
四、防踩坑小贴士
- 星号只能拆一次:
a, *b, *c = seq
❌ 会 SyntaxError。 - 字典拆包时键冲突,后者覆盖前者;若需保留两份,用
collections.ChainMap
。 - 函数定义里
*args
必在**kwargs
之前,顺序颠倒直接 SyntaxError。
记忆口令 :“一 * 拆序列,两 ** 拆字典;函数收摊全兜底,顺序别搞反。”