基本概念

解包相当于是把列表,元组之类的元素拆成一个一个元素,而打包则是反向的过程,比如

# 1
t = (4, 2, 3)
a, b, c = t
# a=4, b=2, c=3

# 2
l = [4, 2, 3]
a, b, c = l
# a=1, b=2, c=3

# 3
d = {"d": 1, "b": 2, "c": 3}
a, b, c = d
# a='d', b='b', c='c'
# 4
s = {4, 2, 3}
a, b, c = s
# a=2, b=3, c=4
# 4
a, b = l

这四组中前三组都是对的,最后一组错误的原因为,当使用这种解包的方式时,元素个数必须和集合类元素的长度相同。需要注意的是对字典进行解包的时候,是对键值进行拆解

* 和 **

python 中的 *** 为解包和打包提供了一些便捷的操作,他们都有两种语义

打包

当这两个符号出现在左侧时,起到打包的作用。

* 的打包:

a, *b = [1, 2, 3]
# a=1, b=[2,3]
a, *b = (1, 2, 3)
# a=1, b=[2,3]
a, *b, c = [1, 2, 3, 4]
# a=1, b=[2,3], c=4

这种方式里,首先将给确认的元素赋值,然后剩下的元素以 列表 的形式打包。另外,

** 打包是将若干个 key=value 打包成字典,比如:

def func(**kwargs):
    for k, v in kwargs.items():
        print(k, v)
func(a=1,b=2)

解包

当这两个符号出现在右侧时,起到解包的作用。

* 的解包:

l = [1, 2, 3]
print(*l)
# 1, 2, 3

** 的解包能将字典拆成 key=value 的形式,下面是利用这个的一种函数的传参方法

def func(a, b):
    pass

d = {"a": 1, "b": 2}
func(**d)

References

  1. python中的拆包与封包-知乎
  2. PEP 3132 – Extended Iterable Unpacking