Python函数参数的求值时机是什么?为何lambda作为参数时输出顺序不同?
输出顺序差异原因解答
核心原因是 Python默认采用应用序求值(值调用),函数调用的所有参数会先完成求值,再传入函数体执行;而lambda是未执行的函数定义,其内部逻辑只有在被主动调用时才会触发求值。
第一段代码执行流程
对应代码:print((lambda x: D(1, D(2, D(4, x))))(5))
- 给最外层lambda传入参数5,开始执行lambda内部的
D(1, D(2, D(4, x)))逻辑 - 要调用
D(1, 第二个参数),必须先对第二个参数D(2, D(4, x))完成求值 - 要调用
D(2, 第二个参数),必须先对第二个参数D(4, 5)完成求值:此时打印4,返回值为5 - 现在
D(2,5)可执行:打印2,返回值为5 - 现在
D(1,5)可执行:打印1,返回值为5 - 最外层print打印返回的5
输出顺序为4→2→1→5,和运行结果一致。
第二段代码执行流程
对应代码:print(D(1, lambda x: D(2, D(4, x)))(5))
- 先调用
D(1, lambda参数):两个参数分别是常量1、lambda函数对象(lambda内部逻辑此时不会执行,仅作为对象传参) - 执行D函数体:先打印1,返回第二个参数即lambda函数对象
- 给返回的lambda传入参数5,才开始执行lambda内部的
D(2, D(4, x))逻辑 - 要调用
D(2, 第二个参数),先对D(4,5)求值:打印4,返回5 - 执行
D(2,5):打印2,返回5 - lambda返回5,最外层print打印该返回值
输出顺序为1→4→2→5,和运行结果一致。
机制原理说明
你观察到的“lambda延迟求值、函数调用优先求值”是Python两个基础规则的体现:
- 函数调用的参数求值优先级高于函数体执行:所有参数全部求值完成后,才会进入函数体运行代码
- 函数/lambda的定义逻辑不会自动执行:只有拿到返回的函数对象后,主动加括号传参调用,内部代码才会运行,相当于实现了延迟求值的效果。
内容的提问来源于stack exchange,提问作者piedpiper
相关产品推荐
相关产品推荐

