You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python嵌套yield调用如何保留所有层级函数的内部状态?

问题根因

你当前代码每次在read_stream的循环体内执行num = foo(),相当于每次迭代都创建了一个全新的foo生成器实例,每个生成器实例的内部变量是互相隔离的,自然internal_state每次都会从0开始重置。

解决方案

完全可以在保留现有嵌套yield写法、不改动上层调用接口的前提下解决问题,只要把foo生成器的初始化逻辑提到循环外部,全程复用同一个实例即可:

from random import randint

def foo():
    internal_state = 0
    while True:
        num = randint(0,100000)
        if num == 7:
            internal_state += 1
            print(internal_state)
            yield num
            
            
def read_stream():
    global max_reads
    # foo生成器仅初始化一次,全程复用同一实例
    foo_generator = foo()
    for reads in range(0,max_reads):
        print("counter=", str(reads))
        yield next(foo_generator)

如果需要跨多次read_stream调用也保留foo的内部状态,可以把foo生成器作为参数传入即可:

def read_stream(foo_generator):
    global max_reads
    for reads in range(0,max_reads):
        print("counter=", str(reads))
        yield next(foo_generator)

# 上层调用示例,foo生成器全局复用
g = foo()
for e in read_stream(g):
    print(e)

原理说明

Python的生成器函数本身不会执行内部逻辑,只有调用生成器函数(如foo())时才会创建一个独立的生成器实例,每个实例的内部状态互不干扰。只要复用同一个生成器实例,就能保留内部变量的状态,不需要修改原有的yield嵌套逻辑,也不需要调整上层的遍历接口。

内容的提问来源于stack exchange,提问作者A.U de la Torre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:06:08