Python单星号与双星号的核心用法解析
在Python编程中,单星号(*)与双星号(**)是一对基础却极易混淆的语法符号——它们虽同名“星号”,但一个专门处理可迭代对象,另一个则聚焦于字典操作。许多初学者见到别人代码中的*args和**kwargs时,往往只会简单模仿,一旦遇到实际场景便容易出错。今天我们将彻底拆解这两者的具体用法,让你看完之后能够准确判断该用哪个星号。


一、单星号(*):可迭代对象的“解包利器”与可变位置参数
单星号的核心作用围绕可迭代对象展开——无论是解包列表、元组,还是定义可变数量位置参数,都离不开“可迭代”这一概念。下面介绍的三个高频使用场景,每个都是实际开发中的硬核技能。
1. 用法一:解包可迭代对象,简化赋值与传参
当你持有列表或元组,希望一次性取出内部元素,或者将其整个传递给函数时,单星号能帮你省去大量循环和索引操作。
示例1:解包赋值
# 常规写法:逐个赋值,繁琐
nums = [10, 20, 30, 40]
a = nums[0]; b = nums[1]; c = nums[2]; d = nums[3]
print(a, b, c, d) # 输出:10 20 30 40
# 单星号解包:一步到位
nums = [10, 20, 30, 40]
a, b, c, d = *nums, # 注意末尾的逗号,避免语法报错
print(a, b, c, d) # 输出:10 20 30 40
示例2:解包传递给函数
def add(a, b, c):
return a + b + c
# 常规写法:逐个传
print(add(10, 20, 30)) # 输出:60
# 单星号解包:直接传可迭代对象
nums = [10, 20, 30]
print(add(*nums)) # 等价于 add(10, 20, 30),输出:60
注意:解包时元素个数必须和函数参数个数保持一致,否则会直接触发异常——后续讲解可变参数时会解决这一问题。
2. 用法二:合并多个可迭代对象
单星号还能快速拼接多个列表或元组,比链式调用extend()更加简洁优雅。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]
# 常规写法:extend 需要多次调用
new_list = list1.copy()
new_list.extend(list2)
new_list.extend(list3)
print(new_list) # [1,2,3,4,5,6,7,8,9]
# 单星号一步到位
new_list = [*list1, *list2, *list3]
print(new_list) # [1,2,3,4,5,6,7,8,9]
3. 用法三:函数的可变位置参数(*args)
这是单星号最核心的用法——当函数不确定接收多少个位置参数时,借助*args将所有传入的位置参数打包为一个元组。参数名不固定(例如*abc也可),但业界惯例推荐使用args。
def add_all(*args):
print("args的类型:", type(args)) #
print("args的内容:", args) # 打包成元组
return sum(args)
print(add_all(10, 20)) # 输出:30
print(add_all(10, 20, 30, 40)) # 输出:100
print(add_all()) # 输出:0(空元组)
请牢记:*args仅能接收位置参数,无法处理关键字参数——例如add_all(a=10, b=20)会直接抛出错误。
二、双星号(**):字典的“专属解包工具”与可变关键字参数
双星号与单星号各司其职——它只作用于字典,用于解包键值对、合并字典,以及定义可变数量关键字参数。同样包含三个高频应用场景。
1. 用法一:解包字典,提取键值对
双星号解包字典时,会将键值对展开,常用于函数参数传递。
def print_info(name, age, city):
print(f"姓名:{name},年龄:{age},城市:{city}")
# 常规传关键字参数
print_info(name="张三", age=25, city="北京")
# 双星号解包字典
info = {"name": "张三", "age": 25, "city": "北京"}
print_info(**info) # 等价于上一行
2. 用法二:合并字典
自 Python 3.5+ 起,使用双星号合并字典比update()更简洁,且不会修改原字典。
dict1 = {"name": "张三", "age": 25}
dict2 = {"city": "北京", "job": "程序员"}
dict3 = {"salary": 15000}
# update 写法会修改原字典
new_dict = dict1.copy()
new_dict.update(dict2)
new_dict.update(dict3)
print(new_dict)
# 双星号一步到位,不修改原字典
new_dict = {**dict1, **dict2, **dict3}
print(new_dict) # 结果同上
注意:若多个字典包含相同键,后面的值会覆盖前面的(与update()行为一致)。
3. 用法三:函数的可变关键字参数(**kwargs)
与*args对应,**kwargs用于接收不确定数量的关键字参数,并将其打包为字典。
def print_kwargs(**kwargs):
print("kwargs的类型:", type(kwargs)) #
print("kwargs的内容:", kwargs)
for key, value in kwargs.items():
print(f"{key}:{value}")
print_kwargs(name="张三", age=25)
print_kwargs(city="北京", job="程序员", salary=15000)
输出分别如下:
kwargs的类型:
kwargs的内容: {'name': '张三', 'age': 25}
name:张三
age:25
kwargs的类型:
kwargs的内容: {'city': '北京', 'job': '程序员', 'salary': 15000}
city:北京
job:程序员
salary:15000
最后送你一个速记口诀,保证再也不会用错:
如果处理的是列表、元组(或任何可迭代对象),需要解包、合并,或者函数需要接收任意数量的位置参数 → 使用单星号(*)
如果处理的是字典,需要解包键值对、合并字典,或者函数需要接收任意数量的关键字参数 → 使用双星号(**)
归根结底,单星号和双星号都是 Python 为了简化代码、提升灵活性而设计的语法糖。只需亲自动手练习几次上述示例,你很快就能形成肌肉记忆,以后再也不会选错。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
中国牵头全球首个自动驾驶世界标准 L3/L4上路新阶段
2026年6月,联合国世界车辆法规协调组织通过全球首个自动驾驶技术法规,由中国等多国共同牵头。法规明确L3 L4级系统安全要求、全生命周期管理及测试方法,将于同年7月生效。中国同步推进强制性国家标准,衔接国际规则,推动自动驾驶进入合规新阶段。
当贝耳机Air 1正式发布,AI软硬件一体化全面落地
提到当贝,许多人首先想到的便是“大屏”这一关键词。 这一点并不难理解。从服务超两亿用户的软件生态,到“每卖出两台激光投影,就有一台是当贝”的市场份额,这家智能科技企业在客厅场景中的影响力已十分稳固。然而,当贝的愿景显然不止局限于客厅。近期,当贝正式发布了其首款AI耳机——当贝耳机 Air 1。这绝非
万元起 杜卡迪全新揽途Multistrada V4 Rally上市
杜卡迪全新揽途MultistradaV4Rally上市,起售价23 8万元。搭载V4Grandturismo发动机,标配自动降低装置、Skyhook悬挂及前后雷达,兼顾长途探险与运动性能。翡翠绿版限量10台,售价24 1万元。
美团CEO王兴自公司成立从未卖股且无计划
在6月26日的美团股东大会上,CEO王兴放出了一个相当直白的表态:从公司成立至今,他个人手里的股票一股都没卖过,而且未来也没有任何减持计划。这话放在当前的市场环境下,分量不言而喻。 王兴还专门解释了去年那笔备受关注的股票转让——2024年他将个人持股的10%捐给了一家基金会。他强调,这完全是出于公益
芯明与钧舵机器人正式启动战略合作 深度融合生态共进
1月22日,钧舵机器人与芯明智能等企业签署战略合作协议,旨在从芯片级到系统级融合机械结构、感知与控制算法,打造低成本、高灵活性的智能末端执行器,推动具身智能生态共建。
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-07-05 14:36
2026-07-05 14:36
2026-07-05 14:34
2026-07-05 14:34
2026-07-05 14:34
2026-07-05 14:34
2026-07-05 14:33
2026-07-05 14:33
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

