Python 嵌套列表理解与嵌套for循环不同

Python 嵌套列表理解与嵌套for循环不同,python,for-loop,list-comprehension,nested-loops,Python,For Loop,List Comprehension,Nested Loops,我有以下嵌套循环: for i in range(1,5): for j in range(0,i): j 当我尝试使用列表理解重新表达相同内容时,我得到了奇怪的结果 [j for j in range(0,i) for i in range(1,5)] 首先,有人能用这个列表来解释输出吗?我似乎真的不明白Python在这里做什么 其次,的迭代器的内部能否不显式地依赖于外部索引 第三,是否有任何方法可以修改列表理解以获得与开头编写的嵌套for

我有以下嵌套循环:

for i in range(1,5): 
        for j in range(0,i):
                j
当我尝试使用列表理解重新表达相同内容时,我得到了奇怪的结果

[j for j in range(0,i) for i in range(1,5)]
首先,有人能用这个列表来解释输出吗?我似乎真的不明白Python在这里做什么

其次,的迭代器的内部
能否不显式地依赖于外部索引


第三,是否有任何方法可以修改列表理解以获得与开头编写的嵌套for循环相同的结果?

如果列表理解之外没有定义
i
,列表理解将不会运行

要实现您想要的(是的,这是违反直觉的),您需要这样做:

[j  for i in range(1,5) for j in range(0,i)]
这将产生:

[0, 0, 1, 0, 1, 2, 0, 1, 2, 3]

这与嵌套for循环的顺序相同。

在列表中交换循环的顺序。@MateenUlhaq是的,谢谢。如果尚未定义i,则不会编译。什么?同样,它是编译的,否则它不会引发运行时错误。这是编程,它是关于头发分割的。我猜在定义I之前,您已经有了另一个for循环,或者使用I在同一个控制台中运行了一些东西。如果启动一个新的python控制台并运行代码,您将发现python无法运行原始列表。