为什么是Python的列表理解循环顺序向后? [重复] 为什么是Python的列表理解循环顺序向

2019-05-12 04:22发布

这个问题已经在这里有一个答案:

  • 为什么多`for`列表理解的顺序事情是这样的? 1个回答
>>> 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

使最快变化的循环是最接近行动,所以来讲话。 这还适合于在逻辑上更逐步地从左到右读取。

这是用户之间的共同情感? 或者有没有人有一个很好的反驳,为什么目前的语法实现真正​​是“正确的”?

Answer 1:

考虑:

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

它可能会更有意义用简单的英语在一定程度上,但可能相反的论点是, 这里的名字“分支”而不被(还)定义使用



文章来源: Why is Python's list comprehension loop order backwards? [duplicate]