解包元组列表

4

今天我被以下代码惊到了:

testcases = [([1, 1, 1], 2, 2)]

for a, b, c in testcases:
    print(a, b, c)

它会打印输出:

[1, 1, 1] 2 2

我预计会有错误,并认为我们需要第二个循环来获取元组的元素。 有人可以解释一下它是如何工作的吗? 我不明白abc 是如何赋值的。我使用的是Python 3.6。干杯!

2个回答

7

让我们看看你拥有什么:

testcases = [([1, 1, 1], 2, 2)]

这是一个列表,大小为一。所以testcases [0]是唯一的元素。

因此,这段代码:

for a, b, c in testcases:
    pass

这是一个长度为一的循环。因此每次通过循环(仅一次),您会获得元素:([1, 1, 1], 2, 2),它是一个大小为三的元组

因此,解包它:a,b,c = testcases [0]给出:

a == [1, 1, 1]
b == 2
c == 2

这就是您看到的打印内容。


我使用了一个元素的列表来简化问题。 我不明白元组是如何解包的。我认为 a == ([1, 1, 1], 2, 2) 会发生错误... - idetyp
1
但通常当我们使用x in y时,x被定义为y内部的某个元素,而不是y内部的元素的内部元素。我们如何解释这一点呢? - Joshua Varghese
但我现在明白了。首先,列表的一个元素被取出,然后进行赋值。由于它是一个元组,所以它按照您的期望工作,并且a、b、c被分配。干杯! - idetyp

0

在元组解包期间,左侧的变量总数应等于给定元组中的值的总数。 Python提供了传递可选参数(*arguments)进行任意长度元组解包的语法。所有值将按照其规定的顺序分配给每个变量,并且所有剩余的值将被分配给*arguments。例如:

>>> tup = ("Elem1", "Elem2","Elem3","Elem4","Unpacking a tuple")
>>> (unp1,*unp2, unp3) = tup
>>> print(*unp2)
Elem2 Elem3 Elem4
>>> print(unp1)
Elem1
>>> print(unp3)
Unpacking a tuple
>>> print(type(unp1),type(unp3))
<class 'str'> <class 'str'>
>>> print(type(unp2))
<class 'list'>

在更低的层面上,我们正在创建一个由5个元素组成的元组,然后循环遍历该元组,并将从循环中获取的每个五个项目分配给左侧的三个变量,以此顺序。 希望这可以帮助到您。


1
谢谢。我只是感到惊讶,因为我没有考虑迭代中发生的一系列事情:
  1. 获取列表的第一个元素
  2. 进行赋值
如果赋值直接发生,那么只有 a 会被分配给整个元组。希望你能理解我的观点/困惑。
- idetyp
我已经编辑了答案。希望你现在对正在发生的事情有一个清晰的理解。 - Nick Rogers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接