Python生成器跨函数调用时计数连续异常的原因及同场景输出实现方案咨询
问题1:为什么计数器会跨生成器实例连续递增?
这是因为Python在创建字典action_item时,会立即计算所有字典值的表达式,而非等到你调用get(input)时才执行。换句话说,每次调用switchAction,不管你传入的是"A"、"B"还是"C",next(aaa)、next(bbb)、next(ccc)这三个操作都会被完整执行一遍——你只是最后返回了对应键的结果,另外两个生成器的递增过程被隐藏了而已。
举个具体的执行流程:
- 第一次调用
switchAction("A"):三个生成器都执行了next,aaa到1、bbb到1、ccc到1,你拿到的是aaa的1; - 第二次调用
switchAction("A"):三个生成器再次执行next,aaa到2、bbb到2、ccc到2,你拿到的是aaa的2; - 第三次调用
switchAction("B"):三个生成器又一次执行next,aaa到3、bbb到3、ccc到3,你拿到的是bbb的3;
以此类推,最终输出就变成了连续的1、2、3、4、5、6。
问题2:如何修改代码让第二种场景输出与第一种一致?
核心思路是延迟执行next()调用,只在需要的时候才对目标生成器执行递增操作。这里有两种简洁的实现方式:
方式1:字典存储生成器实例,返回时再调用next()
def switchAction(input): # 直接存储生成器对象,不提前执行next action_item = { "A": aaa, "B": bbb, "C": ccc } target_gen = action_item.get(input) # 仅对选中的生成器执行next操作 return next(target_gen) if target_gen else None
方式2:用Lambda表达式包装next(),延迟执行
def switchAction(input): # 用Lambda把next调用包装成函数,只有调用时才执行 action_item = { "A": lambda: next(aaa), "B": lambda: next(bbb), "C": lambda: next(ccc) } target_func = action_item.get(input) return target_func() if target_func else None
这两种方式都能保证每次调用switchAction时,只有你指定的生成器会被执行next(),其他生成器的状态不会改变,最终输出就会和第一种场景完全一致:1 2 1 2 1 2。
内容的提问来源于stack exchange,提问作者Lokesh
相关产品推荐
相关产品推荐

