Python范围生成器是生成所有值还是逐步生成它们?

Python范围生成器是生成所有值还是逐步生成它们?,python,python-2.7,Python,Python 2.7,当你这样做的时候: for i in range(5): print i Python做什么?它是否先生成一个带有[0,1,2,3,4]的数组,然后再遍历每个项目来打印它? 类似于: for i in [0,1,2,3,4]: print i 还是在生成数字时打印每个数字?比如: 生成0将0分配给i打印i 生成1->将1分配给i->打印i 生成2->将2分配给i->打印i 生成3->将3分配给i->打印i 生成4->将4分配给i->打印i 更新 我已经为Python2.7添加

当你这样做的时候:

for i in range(5):
      print i
Python做什么?它是否先生成一个带有[0,1,2,3,4]的数组,然后再遍历每个项目来打印它? 类似于:

for i in [0,1,2,3,4]:
  print i
还是在生成数字时打印每个数字?比如:

生成0将0分配给i打印i

生成1->将1分配给i->打印i

生成2->将2分配给i->打印i

生成3->将3分配给i->打印i

生成4->将4分配给i->打印i

更新

我已经为Python2.7添加了标记。我不认为我的问题是特定版本的,但似乎是这样


现在我正在使用Python2.7,所以我的问题就是指这个。但我发现比较Python2范围和Python3范围的信息非常有价值。

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

print range(4)
在Python 2中,
range()
返回整个列表对象,然后返回该列表 对象由为进行迭代

在Python3中,它返回,这是一个 对象本身具有专用的逻辑和方法,而不是列表。现在
for
将获取由该iterable生成的每个值

在Python2中,有
xrange()
可以获得类似Python3的东西
range()
do。Python2的xrange介于Python2的xrange之间 范围和Python 3的范围。它比前者好,但不如前者 跟后者一样好

最后,在Python3中,如果您想要整个列表,请执行以下操作:

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

@TigerhawkT3如果我没记错的话,Python 3中的
range
比标准的
yield
迭代器要复杂得多,所以我不认为它会重复这个问题它实际上是一个生成器,它实现了
\uuuuu包含的一些数学和一些特殊的逻辑,所以你可以对它进行两次迭代,但是,您是否对Python3或Python2.7感到好奇?他们有两种非常不同的行为。是的,我看到了关于生成器生成的部分,但错过了关于
range
而不是生成器的部分。显然,Python2在这个范围内。无论如何,是的,在Python2中,
range
函数确实返回了一个
列表。这就是为什么Python 3对其进行了如此彻底的更改(基本上是重写的)。我知道它会返回一个值列表,我只是想知道它是如何工作的。当它在不同的上下文中使用时,任何函数都不应该以特殊的方式运行,因此在Python 2中,
range
始终会返回一个列表。