在 Python 中解包(展開並分配給多個變量)元組和列表

商業

在 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
# []
Copied title and URL