在看别人写的python代码的时候,有时候会看到在变量前面加上一个*或者是**,上网找了一下相关的资料发现这些星号原来是python中的解包操作,相当于将一个容器中的元素取出来然后分配给不同的变量,下面是我看别人写的博客自己的一些理解:
(1) 一个星号解包
① 解包可以使用在多个变量赋值或者是函数调用中,并且任何可迭代的对象都支持解包,其中包括列表/字符串/元组/字典/集合等这些常见的可迭代对象
a, b = 1, 2
a, b = b, a
print(a, b)
# 任何可迭代的对象都可以解包, 可迭代对象包括元组/字典/集合/列表
a, b, c = (1, 2, 3)
print(a, b, c)
a, b, c = "456"
print(a, b, c)
a, b, c = {7, 8, 9}
print(a, b, c)
# 字典解包之后只会留下key, 而value就会被丢掉了
a, b, c = {"a":1, "b":2, "c":3}
print(a, b, c)
② 在解包的过程遇到左边的变量个数小于右边可迭代的变量个数的时候会先分配那些没有带*号的, 最后剩余的元素分配给带星号的变量, 而且这个*是可以放在任意位置的
a, b, *c = [1, 2, 3, 4]
print(a, b, c)
a, *b, c = [1, 2, 3, 4]
print(a, b, c)
③ 调用函数时时候解包传递参数
def unpack_fun(a, b, c):
print(a, b, c)
if __name__ == '__main__':
unpack_fun(*[1, 2, 3])
解包使用在表达式中可以用来合并两个不同类型的可迭代参数,简化操作
list1 = [1, 2, 3]
list2 = range(3, 8)
# 解包操作合并两个列表
list = [*list1, *list2]
print(list)
(2) 两个**解包
两个**号的解包是使用在字典中的,比如合并两个字典,在函数调用时候通过解包传递字典类型参数
def dic_fun(name, password):
print(name)
print(password)
if __name__ == '__main__':
# 下面属于字典的解包操作我们可以使用两个**这样就可以将字典解包成key=value的形式
dic = {"name": "zhaozhao", "password": "123456"}
dic_fun(**dic)
# 合并两个字典也可以使用解包操作
dic1 = {"a": 1, "b": 2, "c": 3, "d": 4}
dic2 = {"e": 5, "f": 6, "g": 7, "h": 8}
dic = {**dic1, **dic2}
print(dic)
总结:本质上是将可迭代对象的元素取出来分配给其他的变量