术语“解包”指的是将元组项解析到单独变量的过程。在 Python 中,圆括号是序列对象字面量表示的默认分隔符。
以下声明元组的语句是相同的:
>>> t1 = (x,y)
>>> t1 = x,y
>>> type(t1)
<class 'tuple'>
示例
要将元组项存储在单独的变量中,在赋值操作符的左侧使用多个变量,如下例所示:
tup1 = (10, 20, 30)
x, y, z = tup1
print("x: ", x, "y: ", y, "z: ", z)
它将产生如下输出:
x: 10 y: 20 z: 30
这就是元组是如何被解包到单独的变量中的。
在上面的例子中,赋值操作符左侧的变量数量等于元组中的项数。如果数量不相等会怎么样?
解包元组时的 ValueError 错误
如果变量的数量多于或少于元组的长度,Python 会引发 ValueError 错误。
示例
tup1 = (10, 20, 30)
x, y = tup1
x, y, p, q = tup1
它将产生如下输出:
x, y = tup1
^^^^
ValueError: too many values to unpack (expected 2)
x, y, p, q = tup1
^^^^^^^^^^
ValueError: not enough values to unpack (expected 4, got 3)
使用星号 (*) 解包元组项
在这种情况下,"" 符号用于解包。如下所示,在 "y" 前加上 "":
示例 1
tup1 = (10, 20, 30)
x, *y = tup1
print("x: ", "y: ", y)
它将产生如下输出:
x: y: [20, 30]
元组中的第一个值被分配给 "x",其余的项则分配给 "y",使其成为一个列表。
示例 2
在这个例子中,元组包含 6 个值,并且要解包的变量有 3 个。我们在第二个变量前加上 "*":
tup1 = (10, 20, 30, 40, 50, 60)
x, *y, z = tup1
print("x: ", x, "y: ", y, "z: ", z)
它将产生如下输出:
x: 10 y: [20, 30, 40, 50] z: 60
在这里,值首先被解包到 "x" 和 "z" 中,然后其余的值被分配给 "y" 作为列表。
示例 3
如果我们在第一个变量前加上 "*" 会怎么样?
tup1 = (10, 20, 30, 40, 50, 60)
*x, y, z = tup1
print("x: ", x, "y: ", y, "z: ", z)
它将产生如下输出:
x: [10, 20, 30, 40] y: 50 z: 60
这里同样,元组是以这样的方式解包的,即各个变量首先占据值,剩下的值留给列表 "x"。