【发布时间】:2018-09-29 06:50:05
【问题描述】:
场景:
for i in range(6):
for j in range(i):
j
AFAIK,在列表理解中,最右边的 for 是最外面的,所以我认为下面的代码可以工作:
[ j for j in range(i) for i in range(6)]
但令我惊讶的是,它抛出了NameError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
我想知道为什么它不起作用。是因为 python 从从左到右计算表达式吗? 原因,我已经用括号解决了这个问题:
[ (j for j in range(i)) for i in range(6)]
输出一堆生成器表达式:
[<generator object <listcomp>.<genexpr> at 0x7f3b42200d00>, <generator object <listcomp>.<genexpr> at 0x7f3b42200d58>, <generator object <listcomp>.<genexpr> at 0x7f3b42200db0>, <generator object <listcomp>.<genexpr> at 0x7f3b42200e08>, <generator object <listcomp>.<genexpr> at 0x7f3b42200e60>, <generator object <listcomp>.<genexpr> at 0x7f3b42200eb8>]
要探索这些生成器表达式中的内容,我们可以简单地将它们转换为列表,即
[ list(j for j in range(i )) for i in range(6)]
输出如预期:
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
我只想知道这里到底发生了什么。
【问题讨论】:
-
[ j for i in range(6) for j in range(i)]试试这个 -
我无法确切地告诉您为什么该命令会被这样解释,但要获得开箱即用的预期行为,请使用
[ j for j in (range(i) for i in range(6))] -
“最右边的是最外面的”。不,顺序与循环的“传统”相同。我认为您对嵌套列表理解感到困惑,例如
[[j for j in range(i)] for i in range(6)]。 -
@PM2Ring 是的,我很困惑。
标签: python python-3.x list-comprehension nested-loops