我对这个列表理解感到有点困惑:
l = [[i * j for j in range(3, 5)] for i in range(3)]
执行的顺序是什么?
答案 0 :(得分:3)
这是一个非常简单的列表理解形式:
[expression for var in iterable]
在这种情况下,expression
恰好是另一个列表理解。因此,内部理解将对外部可迭代产生的每个项目进行一次评估。
如果我们将内心理解分解为一个函数,可能会感觉更清楚一点:
def inner(i):
return [i * j for j in range(3, 5)]
l = [inner(i) for i in range(3)]
现在我们更清楚地看到(希望无论如何)外在理解导致内部理解为每个" i
"执行一次。在range(3)
。
答案 1 :(得分:0)
想象一下,它是从外面执行的。
[X for i in range(3)]
在这种情况下,X本身就是另一个列表理解:
[i*j for j in range(3,5)]
其中i
绑定到单个值。
因此它扩展为[[0*3,0*4],[1*3,1*4],[2*3,2*4]]
或[[0,0],[3,4],[6,8]]
,
答案 2 :(得分:0)
以下内容:
l = [[i * j for j in range(3, 5)] for i in range(3)]
i
接受值0
,1
和2
。对于i
的每个值,将评估嵌套列表推导并将结果保存到顶级列表:
[i * j for j in range(3, 5)]
此处,j
采用值3
和4
。对于每个值,保存j
与当前值i
的乘积。
对于i
的第一个值,即0
,这是0
值的j
倍,因此您获得了[0, 0]
。
对于i
的第二个值,即1
,这是1
值的j
倍,因此您获得[3, 4]
。
对于i
的第三个值,即2
,这是2
值的j
倍,因此您获得[6, 8]
。
最终结果是由这三个子列表组成的列表,所以你得到:
[[0, 0], [3, 4], [6, 8]]
答案 3 :(得分:0)
l = [[i * j for j in range(3, 5)] for i in range(3)]
可以想象为:
(1) l = [[i * j for j in range(3, 5)] with i = 0] => [[0*3, 0*4]]= [[0,0]]
+(2) l = [[i * j for j in range(3, 5)] with i = 1] =>[[0,0], [3,4]]
+(3) l = [[i * j for j in range(3, 5)] with i = 2] =>[[0,0], [3,4], [6,8]]