问题
现在有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?
解决方案
任何序列(可迭代对象),通过一个简单的赋值语句,可以解压并赋值给多个变量;
唯一的前提就是变量的数量必须与序列元素的数量相同。
代码示例:
>>> x = [1, 'python', (2018, 12, 11)]
>>> a
1
>>> b
'python'
>>> c
2018
>>> d
12
>>> e
11
如果变量个数和序列元素的个数不匹配,会产生一个异常。
代码示例:
>>> y = [4, 5]
>>> n, m, p = y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
讨论
实际上,这种解压赋值可以用在任何可迭代对象上,而不仅仅是列表或者元组。 包括字符串,文件对象,迭代器和生成器。
代码示例:
>>> s = 'mac'
>>> x, y, z = s
>>> x
'm'
>>> y
'a'
>>> z
'c'
如果只想解压一部分,丢弃其他的值。对于这种情况 Python 并没有提供特殊的语法。 但是你可以使用任意变量名去占位,到时候丢掉这些变量就行了,但是必须保证选用的那些占位变量名,在其他地方没被使用到。
代码示例:
>>> x = [1, 'python', (2018, 12, 11)]
>>> a, b, _ = x
>>> a
1
>>> _
(2018, 12, 11)
解压不确定个数或任意个数元素的可迭代对象时,可以使用星号表达式。通常,这些可迭代对象的元素结构有确定的规则(比如只需要获取首尾2个元素)。
代码示例:
# case-1
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> *b, c = a
>>> b
[1, 2, 3, 4, 5, 6]
>>> c
7
# case-2
>>> record = ['python', 12, 9.11, (10, 11, 2018)]
>>> name, *b, c = record
>>> name
'python'
>>> c
(10, 11, 2018)
>>> b
[12, 9.11]