仅调用方式不同的两段Python闭包代码输出差异原因咨询
两段Python代码输出差异原因说明
首先需要先修正你给出的示例中存在的两处对应错误:你标注的两段代码输出是颠倒的,且第二段代码按你的写法会直接触发TypeError: 'int' object is not callable报错,我调整对应关系后解释核心逻辑:
写法1:返回内部函数对象(对应你标注的输出1100/2100/3100)
def les(): key = 100 def nes(): nonlocal key key += 1000 return key return nes # 仅返回nes函数本身,不执行 result = les() # 你原示例漏写了调用括号,直接print(result)只会打印函数内存地址 print(result()) print(result()) print(result()) # 正确输出:1100、2100、3100
逻辑说明:
- 调用
les()时,会在内存中生成局部变量key=100,以及内部函数nes - 因为
nes引用了外部的key变量,Python会把key和nes绑定形成闭包,key的生命周期会和nes保持一致,不会在les执行结束后被回收 - 每次调用
result()(本质是调用nes),修改的都是闭包中同一个key变量,所以数值会持续累加
写法2:返回内部函数执行结果(对应你标注的输出1100三次)
def les(): key = 100 def nes(): nonlocal key key += 1000 return key return nes() # 直接调用nes,返回计算后的整数值 result = les() # 直接打印整数变量,不需要加括号 print(result) print(result) print(result) # 输出:1100、1100、1100
逻辑说明:
- 调用
les()时就会直接执行一次nes,把key修改为1100后返回这个整数值赋值给result - 后续三次打印的都是同一个固定的整数变量,自然不会有数值变化
内容的提问来源于stack exchange,提问作者user16836821
相关产品推荐
相关产品推荐

