yield中的yield存储值在哪里

时间:2018-01-25 03:29:38

标签: python generator yield

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

我想在python中知道yield如何知道在迭代期间应该返回哪个值而不将所有数据一次存储在内存中?

根据我的理解,如果我想使用1 to 100打印yield,则yield需要首先知道或存储1 to 100,然后移动第一点一个返回值?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

每次生成器yield时,生成器的堆栈帧都保存在生成​​器对象内部,因此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