在 Python 中,元組或列表的元素可以擴展並分配給多個變量。這稱為序列解包或解包分配。
此處描述了以下詳細信息。
- 解包元組和列表的基礎知識
- 嵌套元組,解包列表
- 用下劃線拆包:
_
- 用星號拆包:
*
有關使用星號擴展元組、列表和字典並將其作為函數參數傳遞的信息,請參閱以下文章。
解包元組和列表的基礎知識
當變量寫在左側時,用逗號分隔,每個變量都被分配到右側的元組或列表的一個元素。元組和列表都是一樣的(下面的例子都是用元組的形式寫的)。
t = (0, 1, 2)
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# 2
l = [0, 1, 2]
a, b, c = l
print(a)
print(b)
print(c)
# 0
# 1
# 2
請注意,由於元組可以省略圓括號,因此可用於將多個值分配給單行上的多個變量,如下所示。
a, b = 0, 1
print(a)
print(b)
# 0
# 1
如果變量數與元素數不匹配,則會發生錯誤。
# a, b = t
# ValueError: too many values to unpack (expected 2)
# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)
如果變量的數量小於元素的數量,則可以通過在變量名稱後附加星號將剩餘元素分配為列表(見下文)。
嵌套元組,解包列表
嵌套的元組和列表也可以解包。如果您還想解壓縮內容,請將變量包含在以下之一中
()
[]
t = (0, 1, (2, 3, 4))
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)
print(type(c))
# <class 'tuple'>
a, b, (c, d, e) = t
print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4
用_下劃線_解壓。
在 Python 中,不僅是解包的,不需要的值通常會分配給下劃線(下劃線)_。沒有特殊的語法意義;它們被簡單地分配給一個名為 _ 的變量。
t = (0, 1, 2)
a, b, _ = t
print(a)
print(b)
print(_)
# 0
# 1
# 2
用星號拆包
如果變量的數量小於元素的數量,變量名稱中的星號將導致元素作為列表一起分配。
此語法自 Python 3 起已實現,在 Python 2 中不可用。
元素從開頭和結尾分配給不帶星號的變量,其餘元素作為列表分配給帶星號的變量。
t = (0, 1, 2, 3, 4)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]
print(type(c))
# <class 'list'>
a, *b, c = t
print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4
*a, b, c = t
print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4
例如,如果您只想將元組或列表的前兩個元素分配給變量,則可以將上面的下劃線用於不需要的部分。
a, b, *_ = t
print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]
同樣的也可以寫成如下
a, b = t[0], t[1]
print(a)
print(b)
# 0
# 1
只能附加一個星號。如果有多個標有星號的變量,則會導致 SyntaxError 錯誤,因為無法確定為每個變量分配了多少元素。
# *a, b, *c = t
# SyntaxError: two starred expressions in assignment
請注意,即使分配給標有星號的變量的單個元素也被分配為列表。
t = (0, 1, 2)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2]
print(type(c))
# <class 'list'>
如果沒有額外的元素,則分配一個空列表。
a, b, c, *d = t
print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []