Python 在for循环中解包列表列表

Python 在for循环中解包列表列表,python,list,Python,List,假设我用以下方式创建一个列表: a = [[0, 1], [2, 3]] 如果我执行以下for循环: for b in a: print(b) 我明白了 这对我来说很有意义,因为我正在寻找a的元素,在这种情况下,这些元素是子列表。但是,如果我执行: for b, c in a: print(b, c) 我明白了 我本以为会得到的 [0, 1] [2, 3] Python以这种方式解压列表有明显的原因吗?我的意思是,当我请求列表中的对象时,为什么Python会突然给我列表子

假设我用以下方式创建一个列表:

a = [[0, 1], [2, 3]]
如果我执行以下for循环:

for b in a:
    print(b)
我明白了

这对我来说很有意义,因为我正在寻找
a
的元素,在这种情况下,这些元素是子列表。但是,如果我执行:

for b, c in a:
    print(b, c)
我明白了

我本以为会得到的

[0, 1] [2, 3]
Python以这种方式解压列表有明显的原因吗?我的意思是,当我请求列表中的对象时,为什么Python会突然给我列表子元素的元素?

当您指定:

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

您可以这样理解:
对于a中的每个元素,解包到元组“b,c”
您正在解包到整数:

>>> for b, c in a:
...     print(b, c)
...     print(type(b), type(c))
... 
0 1
<class 'int'> <class 'int'>
2 3
<class 'int'> <class 'int'>

理解这里使用的语法是很有帮助的。相关部分如下:

  • 如果目标列表是没有尾随逗号的单个目标, (可选)在括号中,将对象指定给该目标

  • Else:对象必须是一个iterable,其项数必须与 目标列表中有目标,并且从中分配了项目 从左到右,到相应的目标

for
循环本质上归结为:

for (object) in (iterable):
现在让我们看看iterable中有哪些对象:

[0, 1]  # object1: list
[2, 3]  # object2: list
但是当您使用赋值语句时,“Else”子句适用

for (obj1, obj2 of object) in (iterable):
它将对象视为一个内部iterable,并将每个对象解包到内部对象,即
int
s中:

0 1     # obj1 of object1: int, obj2 of object1: int
2 3     # obj1 of object2: int, obj2 of object2: int

您正在经历的是解包赋值,它将一个iterable的元素分配给多个变量。要获得预期行为,请执行以下操作:

b, c = a
print(b, c)
对于b,a:
中的c以与a:中b的
相同的方式迭代
a
,但由于每个元素都是一个2元素iterable,因此它自己的元素会被解包到
b
c
。查看执行此操作时会发生什么:

a = [[0, 1], [2, 3, 4]]
for b, c in a:
    print(b, c)

你会得到一个错误,因为
a[1]
的元素比分配给它的变量要多。

你是否期望
对于a中的b:
对于b,a中的c:
做同样的事情?把
对于b,a中的c看作
对于a中的x:b,c=x#解包'x'
你似乎认为
对于b,a
中的c相当于b=a[0],c=a[1]
。如果
a
将包含第三对,那么您的期望是什么?@UltraInstitute非常感谢,这很有帮助。@guidot您可以就子列表的元素数量进行完全相同的论证。公式不同:for
循环取消了第一个嵌套级别。通过使用复合赋值(无论是在a的
中,b=
还是在
b中,c=a
)可以摆脱第二级。如果不希望这样,请不要使用复合拆包。我接受你的答案,这类似于@UltraInstinct comment,因为它很简单,完全涵盖了我所缺少的内容,从而满足了我的要求。
0 1     # obj1 of object1: int, obj2 of object1: int
2 3     # obj1 of object2: int, obj2 of object2: int
b, c = a
print(b, c)
a = [[0, 1], [2, 3, 4]]
for b, c in a:
    print(b, c)