15
>>> 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 循环),因为这是编写嵌套 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

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

这是用户之间的共同情绪吗?还是有人对为什么当前的语法实现确实是“正确的”有很好的反驳?

4

1 回答 1

8

考虑:

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

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

于 2013-10-21T00:56:18.900 回答