Python3 - 解压序列赋值给多个变量

问题

现在有一个包含 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 "", line 1, in 
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]

你可能感兴趣的:(Python3 - 解压序列赋值给多个变量)