本篇我们介绍如何在 Python 中对元组进行解包(unpack),也就是将元组中的元素赋值给多个不同的变量。
元组回顾
第 29 篇介绍了元组的一些基本概念和操作。实际上,Python 使用逗号(,),而不是括号(())定义元组。例如,以下代码定义了一个包含两个元素的元组:
1,2
同时,括号可以使得元组更加清晰:
(1, 2)
Python 使用括号创建空元组:
()
另外,我们也可以使用 tuple() 构造函数创建元组。例如:
tuple()
即使元组只包含一个元素,定义时也需要使用逗号。以下示例创建了一个单元素的元组:
1,
它和下面的定义作用相同:
(1, )
注意,下面的代码定义了一个整数,而不是元组:
(1)
元组解包
元组解包就是将元组的元素拆分给不同的变量。例如:
x, y = (1, 2)
等号左边时一个由变量 x 和 y 组成的元组,右边则是由两个整数 1 和 2 组成的元组。表达式的作用就是将右边元组 (1, 2) 的元素分别赋予右边元组 (x, y) 的两个元素。最终,x 的值为 1,y 的值为 2。
以下是另一个示例:
x, y ,z = 10, 20, 30
右边的元组包含三个元素:10、20 以及 30。我们可以查看它的类型:
numbers = 10, 20, 30
print(type(numbers))
输出结果如下:
<class 'tuple'>
在以上示例中,变量 x、y 以及 z 的值分别为 10、20 以及 30。
使用元组解包交换两个变量的值
使用传统方法交换两个变量的值需要定义一个临时变量,例如:
x = 10
y = 20
print(f'x={x}, y={y}')
tmp = x
x = y
y = tmp
print(f'x={x}, y={y}')
输出结果如下:
x=10, y=20
x=20, y=10
而在 Python,我们可以利用元组解包实现相同的结果:
x = 10
y = 20
print(f'x={x}, y={y}')
x, y = y, x
print(f'x={x}, y={y}')
输出结果如下:
x=10, y=20
x=20, y=10
下面的语法表示交换变量 x 和 y 的值:
x, y = y, x
在以上表达式中,Python 首先计算右边元组的值,然后将右边的值赋予左边的变量。
伪变量
以下示例对元组进行解包时返回了一个错误:
x, y = 10, 20, 30
ValueError: too many values to unpack (expected 2)
错误的原因是右边的元组包含三个元素,但是左边只有两个变量。
为了解决这个问题,我们可以增加一个变量 _ :
x, y, _ = 10, 20, 30
变量 _ 是 Python 中的一个普通变量,按照习惯,我们称之为伪变量(dummy variable)。
通常,如果我们不在乎变量的值,也不需要使用它的值,可以使用伪变量进行解包。
使用 * 运算符解包
某些情况下,我们并不需要解包元组中的所有元素。例如,我们可能只需要解包前两个元素。这种情况下,可以使用 * 运算符。例如:
r, g, *other = (192, 210, 100, 0.5)
输出结果如下:
192
210
[100, 0.5]
以上示例中,元素 192 被赋予变量 r,元素 210 被赋予变量 g。同时,剩余的元素 100 和 0.5 组成一个列表后被赋予变量 other。
注意,解包操作的左边只能出现一个 * 运算符。以下是一个错误示例:
x, y, *z, *t = (10, 20, 30, '10:30')
SyntaxError: two starred expressions in assignment
在等号右侧使用 * 运算符
Python 允许在等号右边使用 * 运算符。以下是两个元组:
odd_numbers = (1, 3, 5)
even_numbers = (2, 4, 6)
下面的示例使用 * 运算符对这两个元组进行解包并将它们合并成一个新的元组:
numbers = (*odd_numbers, *even_numbers)
print(numbers)
输出结果如下:
(1, 3, 5, 2, 4, 6)
总结
- Python 使用逗号(,)定义元组,而不是使用括号。
- 元组解包意味着将各个元素分配给多个的变量。
- * 运算符用于将解包剩余的元素组成一个列表并分配给指定变量。