python 中的 yield 存储值在哪里

where does the yield store value in python

我理解 generator 一次生成一个值,这样可以节省大量内存,而不像 list 那样将所有值都存储在内存中。

我想知道在 python 中,yield 如何知道在迭代期间应 return 编辑哪个值,而不是将所有数据一次存储在内存中?

以我的理解,如果我想使用yield打印1 to 100yield需要先知道或存储1 to 100然后移动点一个一个到 return 值 ?

如果不是,那么如何一次 yield return 值,而不是将所有值存储在内存中?

简单地说,yield 延迟执行但会记住它停止的地方。但是,更具体地说,当yield被调用时,生成器函数状态中的变量被保存为"frozen"状态。当再次调用 yield 时,内置的 next 函数将要传输的数据在线发送回。如果没有更多数据要产生(因此引发 StopIteration),存储在其 "frozen" 状态的生成器数据将被丢弃。

每次生成器 yields,生成器的堆栈帧都保存在生成​​器对象内部,因此 it can be restored when execution resumes(当请求下一个值时)。

可以看到the structure definition on CPython here.

如果你想看更多,生成器有点内省,所以你可以看看,比如说,本地人的进展,它当前所在的行号等等:

def myrange(n):
    for i in range(n):
        yield i

mr = myrange(10)

# Before any values consumed:
print(mr.gi_frame.f_locals)  # Outputs {'n': 10}
print(mr.gi_frame.f_lineno)  # Outputs 1

next(mr)  # Advance one

print(mr.gi_frame.f_locals)  # Outputs {'n': 10, 'i': 0}
print(mr.gi_frame.f_lineno)  # Outputs 3

list(mr)  # Consumes generator

print(mr.gi_frame)  # Outputs None; the frame is discarded when the generator finishes