我理解生成器返回一个可以保存状态的迭代的一般概念。并且不会一次计算所有内容,而是每次调用next
时计算。这是如何运作的?例如[x for x in range(10) if x%2==0]
vs (x for x in range(10) if x%2==0)
。在列表理解中,一切都被计算并立即存储在内存中。
在生成器中,不生成整个列表,而是生成一个可迭代的生成器对象,该对象计算每次调用next。但是这个发电机必须以某种方式知道它的边界"对吧?发电机如何知道,如果后台没有执行所有计算,从何处上车?我认为它必须知道列表理解中的每一步,并最终如果你最终在整个生成器中循环直到命中StopIteration,我认为你使用的内存大致相同。
答案 0 :(得分:1)
但是这个发生器必须以某种方式知道它的“边界”,对吧?
不,不!它只是继续卡车运输,直到遇到StopIteration
。它一次只能在内存中处理一个元素,然后丢弃它。