为什么多个`for`列表理解的顺序是这样的?

Agu*_*guy 1 python syntax python-3.x

我知道for在嵌套列表中理解的正确方法如下(Python 3):

lista = [[[1,2],[3],[4,5,6]],[[7],[8,9]]]

flatlista = [i for k in lista for j in k for i in j]
# results with [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

但我的自然语言本能强烈反对.我会(错误地)期望代码是:

flatlista = [i for i in j for j in k for k in lista]
Run Code Online (Sandbox Code Playgroud)

错误的版本听起来几乎像英语,从左到右读取一个流.正确的版本需要一些嵌套的阅读技巧,左右跳过以涵盖其含义.

为什么这样的语法呢?为什么用这种方式构建语言?

Mar*_*ers 6

因为这就是PEP 202 - List Comprehensions所设定的.然而,PEP并不能激发为什么,因为它是作为事后的想法创建的; 在PEP创建之前的几年,甚至已经创建了PEP 流程,在开发清单上进行了讨论.

首先,该命令镜像了您在Python代码中嵌套for循环和if语句的顺序:

for k in lista:
    for j in k:
        for i in j:
Run Code Online (Sandbox Code Playgroud)

如果您已经习惯了这种排序,这将非常自然.

关于该功能的最初讨论中,似乎有其他语言的先例用于排序.事实上,Haskell具有相同的顺序:每个连续的生成器都会优化前一个生成器的结果.

当然,Tim Peters(提案的创始人)在某些时候表示今天使用的订单对他来说是显而易见的,请看这篇文章:

我已经将我提出的翻译已经发布到今天的Python中了几次,意图是字面意思,而不是暗示性的.这会将最左边的"for"循环嵌套,所以在所有级别上都有关于排序语义的所有内容.为什么这成为各个层面的辩论点超出了我的范围.