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

仅调用方式不同的两段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:54:00