今天我被以下代码惊到了:
testcases = [([1, 1, 1], 2, 2)]
for a, b, c in testcases:
print(a, b, c)
它会打印输出:
[1, 1, 1] 2 2
我预计会有错误,并认为我们需要第二个循环来获取元组的元素。 有人可以解释一下它是如何工作的吗? 我不明白a
,b
和c
是如何赋值的。我使用的是Python 3.6。干杯!
今天我被以下代码惊到了:
testcases = [([1, 1, 1], 2, 2)]
for a, b, c in testcases:
print(a, b, c)
它会打印输出:
[1, 1, 1] 2 2
我预计会有错误,并认为我们需要第二个循环来获取元组的元素。 有人可以解释一下它是如何工作的吗? 我不明白a
,b
和c
是如何赋值的。我使用的是Python 3.6。干杯!
让我们看看你拥有什么:
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
这就是您看到的打印内容。
在元组解包期间,左侧的变量总数应等于给定元组中的值的总数。 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个元素组成的元组,然后循环遍历该元组,并将从循环中获取的每个五个项目分配给左侧的三个变量,以此顺序。 希望这可以帮助到您。
a
会被分配给整个元组。希望你能理解我的观点/困惑。 - idetyp
a == ([1, 1, 1], 2, 2)
会发生错误... - idetypx in y
时,x被定义为y内部的某个元素,而不是y内部的元素的内部元素。我们如何解释这一点呢? - Joshua Varghese