Python中的解包操作允许我们将可迭代对象中的元素直接拆分赋值给多个变量,星号与双星号操作符是实现解包的核心符号,二者分别对应不同的解包场景,掌握它们的用法能大幅提升代码的简洁性和可读性。

星号操作符的基础用法
星号操作符*主要用于序列类型(列表、元组、字符串等)的解包,基础场景是拆分序列元素赋值给多个变量,当变量数量少于序列元素数量时,星号可以收集多余的元素。
# 基础序列解包 nums = [1, 2, 3, 4, 5] a, *b, c = nums print(a) # 输出1 print(b) # 输出[2, 3, 4] print(c) # 输出5 # 字符串解包 s = "hello" *a, b = s print(a) # 输出['h', 'e', 'l', 'l'] print(b) # 输出'o'
星号操作符在函数参数中的应用
在函数定义时,星号操作符可以用来接收任意数量的位置参数,这些参数会被收集为一个元组;在函数调用时,星号可以将序列类型的参数拆分为独立的位置参数传入函数。
# 函数定义时接收可变位置参数
def sum_nums(*args):
total = 0
for num in args:
total += num
return total
print(sum_nums(1, 2, 3)) # 输出6
print(sum_nums(1, 2, 3, 4, 5)) # 输出15
# 函数调用时拆分序列参数
def add(a, b, c):
return a + b + c
nums = [1, 2, 3]
print(add(*nums)) # 输出6,等价于add(1,2,3)
双星号操作符的基础用法
双星号操作符**专门用于字典类型的解包,基础场景是将字典的键值对拆分后赋值,或者合并多个字典。
# 字典解包赋值
info = {"name": "张三", "age": 20, "city": "北京"}
name, age, city = info.values()
print(name) # 输出张三
# 合并多个字典
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
merged_dict = {**dict1, **dict2}
print(merged_dict) # 输出{'a': 1, 'b': 2, 'c': 3, 'd': 4}
双星号操作符在函数参数中的应用
在函数定义时,双星号操作符可以接收任意数量的关键字参数,这些参数会被收集为一个字典;在函数调用时,双星号可以将字典的键值对拆分为独立的关键字参数传入函数。
# 函数定义时接收可变关键字参数
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="李四", age=22, hobby="编程")
# 函数调用时拆分字典参数
def user_info(name, age, city):
print(f"姓名:{name},年龄:{age},城市:{city}")
info = {"name": "王五", "age": 25, "city": "上海"}
user_info(**info) # 等价于user_info(name="王五", age=25, city="上海")
复杂场景下的组合应用
星号和双星号操作符可以组合使用,处理同时包含位置参数和关键字参数的复杂场景,也可以在嵌套结构中实现多层解包。
# 函数同时接收可变位置参数和可变关键字参数
def complex_func(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
complex_func(1, 2, 3, name="赵六", score=90)
# 多层解包
list1 = [1, 2, 3]
list2 = [4, 5, 6]
dict1 = {"a": 1}
dict2 = {"b": 2}
combined = [*list1, *list2, {**dict1, **dict2}]
print(combined) # 输出[1, 2, 3, 4, 5, 6, {'a': 1, 'b': 2}]
使用注意事项
- 星号操作符只能用于序列类型的解包,不能用于字典;双星号只能用于字典解包,不能用于序列。
- 在一个解包表达式中,星号只能出现一次,否则会抛出语法错误。
- 函数定义时,普通参数要放在
*args之前,**kwargs要放在所有参数的最后。 - 解包操作不会修改原始的可迭代对象,只会生成新的对象或赋值给新的变量。