为什么Python的列表理解循环顺序倒退?

时间:2013-10-21 00:50:56

标签: python list-comprehension

>>> 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]

从左到右阅读时,此语法似乎倒退了。根据{{​​3}},“形式[... for x... for y...]嵌套,最后一个索引变化最快,就像嵌套for循环一样。”是“正确的人”。

似乎选择了这个顺序(从左到右对应于外部到内部嵌套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

这样,最快变化的循环最接近动作,可以这么说。这也有助于以更加逻辑上逐步的方式从左到右阅读。

这是用户的普遍情绪吗?或者有没有人有一个很好的反驳,为什么当前的语法实现真的是“正确的”?

1 个答案:

答案 0 :(得分:7)

考虑:

[leaf for branch in tree for leaf in branch]

它展开如下:

for branch in tree:
    for leaf in branch:
        yield leaf

如果我们用另一种方式写它

[leaf for leaf in branch for branch in tree]

在某种程度上用简单的英语可能更有意义,但可能的反驳是这里使用名称“branch”而没有(尚未)定义