仔细看第二个for
循环:for j in range(0,len(furs[i]))
。即使它是在前面的第一个列表理解([ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) ]
)中创建和使用的,您在这里指的是i
。
i
仅限于第一次理解的范围;从而对第二种理解是不可见的。因此你会得到错误。
第二个变体的工作原理是因为i
和j
都是在相同的列表理解中声明和使用的。
让我们简化一小段代码。试试这个:
>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ]
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
[ [ i * j for i in range(0,10) ] for j in range(0, i) ]
NameError: name 'i' is not defined
>>>
下面结合的内涵,从而使i
和j
到相同的范围:
>>> [ i * j for i in range(0,10) for j in range(0, i) ]
[0, 0, 2, 0, 3, 6, 0, 4, 8, 12, 0, 5, 10, 15, 20, 0, 6, 12, 18, 24,
30, 0, 7, 14, 21, 28, 35, 42, 0, 8, 16, 24, 32, 40, 48, 56, 0, 9,
18, 27, 36, 45, 54, 63, 72]
>>>
现在(面露= P)再次尝试先理解:
>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ]
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18], [0, 3, 6, 9, 12, 15, 18, 21, 24, 27],
[0, 4, 8, 12, 16, 20, 24, 28, 32, 36], [0, 5, 10, 15, 20, 25, 30, 35, 40, 45],
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54], [0, 7, 14, 21, 28, 35, 42, 49, 56, 63],
[0, 8, 16, 24, 32, 40, 48, 56, 64, 72]]
>>>
大达!它的作品,但给出了不同的结果。这是为什么?原因是在示例2之后的最外层范围中可以使用(最后一个)的值i
。也就是说,在列表理解中创建的变量在REPL范围中可用。
(PS:我相信上面的段落可以被改写更好Pythonistas这里,请大家帮帮忙。)
为了验证这一点,请尝试删除i
并再次运行例子3。
>>> del i
>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ]
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
[ [ i * j for i in range(0,10) ] for j in range(0, i) ]
NameError: name 'i' is not defined
>>>
我们又回到原点了。