【发布时间】:2015-01-08 18:02:15
【问题描述】:
我理解生成器返回一个“保存状态”的可迭代对象并且不会立即计算所有内容的一般想法,而是在每次调用 next 时进行计算。这是如何运作的?例如[x for x in range(10) if x%2==0] 与(x for x in range(10) if x%2==0)。在列表理解中,所有内容都会立即计算并存储在内存中。
在生成器中,不会生成整个列表,而是生成一个可迭代的生成器对象,每次调用 next 时都会进行计算。但是这个生成器必须以某种方式知道它的“边界”,对吧?生成器如何知道,如果它不在后台执行所有计算,从哪里开始它停止的地方?我认为它必须知道列表理解中的每一步,最终如果你最终循环遍历整个生成器直到 StopIteration 被击中,我认为你使用的内存量大致相同。
【问题讨论】:
-
嘿,@thefourtheye,事实上,我正准备将相同的信息重新散列成稍微不同的形式。但另一个答案确实也包含足够的信息来回答这个问题。
-
range将返回一个列表(至少在 python 2x 中)......基本上完全消除了生成器的任何好处...... -
@JoranBeasley:让我们假设 OP 正在使用 Python 3.x。 :-)
-
是的,很公平:P