假设我以以下方式创建列表:
a = [[0, 1], [2, 3]]
如果我执行以下for循环:
for b in a:
print(b)
我明白了
[0, 1]
[2, 3]
这对我来说很有意义,因为我正在寻找a
的元素,在这种情况下,它们是子列表。但是,如果执行:
for b, c in a:
print(b, c)
我明白了
0 1
2 3
我本来希望得到
[0, 1] [2, 3]
Python是否有这种明显的理由来解压缩列表?我的意思是,为什么当我在请求列表中的对象时,Python突然为我提供列表的子元素的元素?
答案 0 :(得分:3)
您要在此处解压缩为整数:
>>> 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'>
换一种说法,比较以下两个:
>>> b, c = a; print(b, c)
[0, 1] [2, 3]
>>> b, c = a[0]; print(b,c)
0 1
答案 1 :(得分:2)
指定时:
for b, c in a:
print(b, c)
您可以将其读取为:for each element in a, unpack into the tuple "b, c"
答案 2 :(得分:1)
了解此处使用的Assignment Statement很有帮助。相关部分在这里:
如果目标列表是一个没有尾随逗号的目标, 可以选择在括号中将对象分配给该目标。
其他:该对象必须是可迭代的,且项目数与 在目标列表中有目标,并且从 从左到右,到相应的目标。
password = '%PsC\;=sQ}X4DWA%K'
escaped_password = URI.escape(password)
# => "%25PsC%5C;=sQ%7DX4DWA%25K"
uri.password = escaped_password
循环本质上可以归结为:
for
现在让我们看看您的迭代对象是什么:
for (object) in (iterable):
但是,当您使用Assignment Statement时,“ Else”子句适用。
[0, 1] # object1: list
[2, 3] # object2: list
将对象视为内部可迭代对象,并将每个对象解压缩到内部对象,即内部的for (obj1, obj2 of object) in (iterable):
s:
int
答案 3 :(得分:1)
您遇到的是拆包赋值,该赋值将iterable的元素分配给多个变量。要获得预期的行为,请执行以下操作:
b, c = a
print(b, c)
for b, c in a:
与a
一样通过for b in a:
进行迭代,但是由于每个元素都是2元素可迭代的,因此它自己的元素将解压缩到b
和{{ 1}}。看看这样做会发生什么:
c
您会得到一个错误,因为a = [[0, 1], [2, 3, 4]]
for b, c in a:
print(b, c)
的元素要多于要分配给变量的元素。