¿Por qué el orden de bucle de comprensión de la lista de Python está al revés?

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

es equivalente a

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

Esta syntax parece al revés cuando se lee de izquierda a derecha. De acuerdo con PEP 202 , “La forma [... for x... for y...] anida, con el último índice variando más rápido, al igual que nested para bucles”. es “el correcto”.

Parece que este orden (de izquierda a derecha correspondiente a los bucles nesteds de exterior a interior) se eligió porque ese es el orden en el que se escriben los bucles nesteds para bucles.

Sin embargo, dado que la parte de expresión de la lista de comprensión ( a en el ejemplo anterior), corresponde a la expresión en la parte más interna de los bucles nesteds ( new_list.append(a) en el ejemplo anterior), me parece que el for _ in _ más cercano a esta expresión debe ser el mismo en ambos casos, es decir, debe ser for a in b y hacia afuera:

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

de modo que el bucle de cambio más rápido sea el más cercano a la acción, por así decirlo. Esto también se presta a ser leído de izquierda a derecha de una manera más lógica y gradual.

¿Es este un sentimiento común entre los usuarios? o ¿alguien tiene un buen argumento en contra de por qué la implementación de la syntax actual realmente es “la correcta”?

Considerar:

 [leaf for branch in tree for leaf in branch] 

Se desenrolla como

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

Si lo escribimos de otra manera.

 [leaf for leaf in branch for branch in tree] 

Podría tener más sentido en un lenguaje sencillo en algún nivel, pero un posible argumento en contra es que aquí el nombre “twig” se usa sin estar (aún) definido .