解构任务
在赋值中,你可以使用解包语法将 Iterable 拆分为值:
作为值的解构
a, b = (1, 2)
print(a)
# Prints: 1
print(b)
# Prints: 2
如果你尝试解压缩超过迭代的长度,你将收到错误:
a, b, c = [1]
# Raises: ValueError: not enough values to unpack (expected 3, got 1)
Python 3.x > 3.0
作为清单进行解构
你可以使用以下语法解压缩未知长度的列表:
head, *tail = [1, 2, 3, 4, 5]
在这里,我们将第一个值提取为标量,将其他值提取为列表:
print(head)
# Prints: 1
print(tail)
# Prints: [2, 3, 4, 5]
这相当于:
l = [1, 2, 3, 4, 5]
head = l[0]
tail = l[1:]
它也适用于列表末尾的多个元素或元素:
a, b, *other, z = [1, 2, 3, 4, 5]
print(a, b, z, other)
# Prints: 1 2 5 [3, 4]
忽略解构分配中的值
如果你只对给定值感兴趣,可以使用 _
表示你不感兴趣。注意:这仍然会设置 _
,只是大多数人不会将它用作变量。
a, _ = [1, 2]
print(a)
# Prints: 1
a, _, c = (1, 2, 3)
print(a)
# Prints: 1
print(c)
# Prints: 3
Python 3.x > 3.0
忽略解构分配中的列表
最后,你可以在赋值中使用*_
语法忽略许多值:
a, *_ = [1, 2, 3, 4, 5]
print(a)
# Prints: 1
这不是很有趣,因为你可以在列表上使用索引。好的方法是在一个赋值中保留第一个和最后一个值:
a, *_, b = [1, 2, 3, 4, 5]
print(a, b)
# Prints: 1 5
或者一次提取多个值:
a, _, b, _, c, *_ = [1, 2, 3, 4, 5, 6]
print(a, b, c)
# Prints: 1 3 5