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)