在前面讲函数的内容中,我们提到了用 *args和 **kwargs的方式来解构数据:Python学习笔记——从入门到报废(十三、函数(下))
通常它们会写在函数的形参当中:
def function(*args, **kwargs):pass在这里,
*不是乘法、也不是幂运算,而是结构赋值,通常用来解压提取列表 list、元组 tuple、字典 dict 中的数据。
之前我们简单提到了它们的作用和用法,今天我们单开一篇详细说说。

解构 = 拆开打包好的数据。
把列表、元组、字典看作一个压缩包,单星号、双星号就是解压软件,把里面的存的内容单独提取出来:
* 单星号:用来拆解序列(列表、元组、字符串)** 双星号:专门拆解字典,得到键值对结果* 解构序列数据如果普通打印输出列表,会自带中括号和逗号;而使用单星号可以只输出内部元素,抛弃标点,美化输出形式:
# 原始写法:带括号,格式难看lst = [10, 20, 30]print(lst)# Output: [10, 20, 30]# 单星号解构:直接拆开元素print(*lst)# Output: 10 20 30我们在写代码时,会遇到用如下的方式解构右侧内容,并赋值到左侧多个变量的时候:
var1, var2, var3 = function()var1, var2 = my_list如果我们不确定右侧到底有多少元素能被拆分赋值,那么上述写法就很容易报错。
通常报错翻译过来就是,右侧有多个元素,但左侧被复制的变量数量小于右侧元素的数量
但是搭配星号就能灵活收纳剩余的元素:
name_list = [1, 2, 3, 4, 5]# 前两个固定取值,剩下全部存入resta, b, *rest = name_listprint(a)# Output: 1print(b)# Output: 2print(rest, type(rest))# Output: [3, 4, 5] <class 'list'>注意这里使用星号解构出来的 rest 的数据类型为 list。
但是如果我们想对右侧的收尾元素解构赋值,还能用这种方法吗?答案是可以。
进一步,用星号进行多变量解构拆分并赋值,不一定要在左侧的最后位置。可以在左侧开头、中间、末尾的任意位置。
num = [1, 2, 3, 4, 5, 6]# 取第一个、最后一个,中间全部忽略first, *mid, last = numprint(first, mid, last)# Output: 1 [2, 3, 4, 5] 6如果我们想往一个 list 里添加内容或合并多个列表,常用的是用 extend() 或者 append() 函数。但是,使用星号解构的方式,也能便捷实现:
lst1 = [1, 2, 3]lst2 = [4, 5, 6]lst3 = [7, 8, 9]new_lst = [*lst1, *lst2, *lst3]print(new_lst)# Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]💡 原理就相当于是用星号解构所有元素后,重新生成一个新的列表。
单星号不局限于解构列表,字符串和元组也能完成解构操作:
s = "python"a, *b = sprint(a, b)# Output: p ['y', 't', 'h', 'o', 'n']t = (100, 200, 300)print(*t)# Output: 100 200 300** 解构键值对数据首先要明确,双星号只能解构字典,同时不能用 print(**dict) 的形式打印输出,只能用于进行赋值或合并操作。
字典可以用 update() 合并,缺点是会改动原字典;而双星号合并不会修改原数据:
user1 = {"name": "Godess", "age": 18}user2 = {"gender": "female", "height": 170}new_user = {**user1, **user2}print(new_user)# Output: {'name': 'Godess', 'age': 18, 'gender': 'female', 'height': 170}# 使用 update 合并,会改动原 user1 的内容user1.update(user2)print(user1)# Output: {'name': 'Godess', 'age': 18, 'gender': 'female', 'height': 170}如果两个字典存在相同键,后面字典的键值重复项会覆盖前面字典:
d1 = {"name": "张三", "age": 18}d2 = {"name": "李四"}new_d = {**d1, **d2}print(new_d)# Output: {'name': '李四', 'age': 18}除了用来解构字典外,还可以用于对函数进行传参:
def function1(**kwargs):print(kwargs)function1(name="张三", age=18)# Output: {'name': '张三', 'age': 18}def function2(weight, height):print(f"体重:{weight},身高:{height}")kwargs = {"weight": 70, "height": 1.7}function2(**kwargs)# Output: 体重:70,身高:1.7往期回顾: