>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]]
>>> [a for d in my_list for c in d for b in c for a in b]
[1, 2, 3, 4, 5, 6]
等同于
>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]]
>>> new_list = []
>>> for d in my_list:
... for c in d:
... for b in c:
... for a in b:
... new_list.append(a)
... print(new_list):
[1, 2, 3, 4, 5, 6]
从左到右阅读时,此语法似乎相反。根据PEP 202,“形式为[... for x... for y...]
的嵌套与嵌套for循环的最后一个索引变化最快一样是“正确的”。
看起来选择这个次序是因为嵌套的for循环也是按照外部到内部的顺序书写的。
然而,由于列表推导式(上面示例中的a
)的表达式部分对应于嵌套循环的最内层(上面示例中的new_list.append(a)
),所以在这两种情况下,看起来离这个表达式最近的for _ in _
应该是一样的,即它应该是for a in b
,然后向外扩展:
>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]]
>>> [a for a in b for b in c for c in d for d in my_list]
NameError: name 'b' is not defined
这样可以使变化最快的循环更接近行动,可以这么说。这也使得按照更逻辑分步方式从左到右阅读更容易。
这是否是用户中普遍的看法?或者是否有人有一个好的反对意见来证明当前语法实现确实是“正确的”?
for
循环顺序一致”就是Guido需要的全部答案。除非有一个非常强有力的理由去反对这一点。 - Tim Peters[a for b in my_list for a in b]
与例如[a for a in (b for b in my_list)]
执行的操作不同。前者实际上对my_list
执行了扁平化操作,而后者仅对(my_list
的元素的元素)进行了解包和重新打包。在你思考之前这并不明显。 - mwfearnleya
,那么a
是什么?啊,a for a in b
,好的。但是b
是什么?现在我们期望的是a for a in b for b in c
。有道理,不是吗? - peter