python中的yield存储值在哪里

2024-03-29 02:00:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道generator一次生成一次值,这可以节省大量内存,而不像{}那样将所有值存储在内存中。在

我想知道在python中,yield如何知道在迭代过程中应该返回哪个值,而不需要同时将所有数据存储在内存中?在

在我的理解中,如果我想用yield打印1 to 100,那么{}必须首先知道或存储{},然后逐个移动点以返回值?在

如果不是,那么yield一次返回一次值,但不将所有值存储在内存中?在


Tags: to数据内存过程generatoryield返回值节省
2条回答

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

每次生成器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

相关问题 更多 >