4

我尝试在内部列表中使用外部列表理解的值:

[ x for x in range(y) for y in range(3) ]

但不幸的是,这会引发 NameError 因为名称y未知(尽管外部列表理解指定了它)。

这是 Python 的限制(尝试了 2.7.3 和 3.2.3)还是有充分的理由为什么这不起作用?

是否有计划摆脱限制?

是否有解决方法(一些不同的语法可能我没有弄清楚)来实现我想要的?

4

3 回答 3

16

您在谈论列表推导,而不是生成器表达式。

你需要交换你的 for 循环:

[ x for y in range(3) for x in range(y) ]

您需要像嵌套在常规循环中一样阅读这些内容:

for y in range(3):
    for x in range(y):
        x

具有多个循环的列表推导遵循相同的顺序。请参阅列表理解文档

提供列表推导时,它由一个表达式组成,后跟至少一个for子句和零个或多个fororif子句。在这种情况下,新列表的元素是通过将每个fororif子句视为一个块、从左到右嵌套并在每次到达最里面的块时计算表达式以产生一个列表元素而产生的元素。

当然,生成器表达式也是如此,但它们使用()括号而不是方括号,并且不会立即实现:

>>> (x for y in range(3) for x in range(y))
<generator object <genexpr> at 0x100b50410>
>>> [x for y in range(3) for x in range(y)]
[0, 0, 1]
于 2012-08-13T12:42:16.007 回答
1

你试过了吗:

[x for y in range(3) for x in range(y)]

因为这会产生一个输出......这会产生:

[0, 0, 1]

这可能是也可能不是你想要的......

于 2012-08-13T12:44:35.390 回答
0

只是嵌套另一代。

[ x for x in [range(y) for y in range(3) ]]

给我:

[[], [0], [0, 1]]
于 2012-08-13T12:43:06.213 回答