python range generator是生成所有值还是逐步生成这些值?

Does the Python range generator generate all values or yields them progressively?

本问题已经有最佳答案,请猛点这里访问。

当你这样做的时候:

1
2
for i in range(5):
      print i

Python做什么?它是否首先用[0,1,2,3,4]生成一个数组,然后遍历打印它的每个项?类似:

1
2
for i in [0,1,2,3,4]:
  print i

还是在生成时打印每个数字?类似:

Generate 0 assign 0 to i print i

Generate 1 -> assign 1 to i -> print i

Generate 2 -> assign 2 to i -> print i

Generate 3 -> assign 3 to i -> print i

Generate 4 -> assign 4 to i -> print i

更新

我已经为python 2.7添加了标签。我不认为我的问题是特定于版本的,但似乎是这样!

现在我正在使用python 2.7,所以我的问题就是这个。但是我发现比较python 2和python 3范围的信息非常有价值。


在python 2中,range()返回整个列表对象,然后返回该列表对象由for迭代。

在python 3中,它返回一个内存高效的iterable,它是对象本身带有专用的逻辑和方法,而不是列表。现在for将得到由该iterable生成的每个值。

在python 2中,有xrange()来获得类似于python 3的range()做。python 2的xrange大致介于python 2的范围和python 3的范围。比前者好,但不如前者和后者一样好。

最后,在python 3中,如果需要整个列表,请执行以下操作:

1
>>> list(range(...))

它返回一个值列表。试试看

1
print range(4)