Python lambda在函数内外定义使用的运行差异及原理是什么?
原理说明
该现象是迭代器一次性特性和lambda绑定对象差异共同作用的结果,和lambda本身的特殊内部机制无关,lambda只是Python的匿名函数语法糖,所有行为和普通def定义的函数完全一致。
两个返回lambda的核心差异
- 变量
a对应的lambda逻辑为lambda: zip(x,y):每次调用a()时,都会重新执行zip(x,y)语句,生成一个全新的迭代器对象,因此两次循环调用都能拿到完整的可遍历对象,输出两次完整的配对结果。 - 变量
b对应的lambda逻辑为lambda: source:这里的source是在执行iterator2(zip(x,y))时就已经计算完成的迭代器对象,lambda仅负责重复返回这同一个已存在的迭代器,不会重新生成新的zip实例。
迭代器的一次性特性
Python中所有迭代器(包括zip返回的对象)都遵循单次遍历规则:迭代器遍历到末尾后,后续再次遍历不会返回任何内容。
第一次调用
b()拿到迭代器并完成全量遍历后,该迭代器就已经处于耗尽状态,第二次调用b()仍然返回同一个耗尽的迭代器,因此不会输出任何元素。
如果要让b的行为和a一致,可修改为如下代码:
def iterator2(source): # lambda每次调用时执行传入的source函数,生成新的迭代器 source1 = lambda : source() print(source1) return source1 # 传入生成迭代器的函数,而非已经生成的迭代器 b = iterator2(lambda: zip(x,y))
内容的提问来源于stack exchange,提问作者apple14755
相关产品推荐
相关产品推荐

