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

关于Python装饰器中memoization内memory未重置的技术疑问

关于Python装饰器中memory未重置的问题解答

核心原因是装饰器只在函数定义时执行一次,而非每次调用函数时执行,具体拆解如下:

  1. 装饰器的执行时机
    当你在fibo函数上方写@memoization时,Python解释器在加载这段代码的瞬间,就会自动执行memoization(fibo):
  • 此时创建了memory = {}并打印空字典
  • 定义并返回内部的inner函数
  • 最后把原来的fibo变量替换成了这个inner函数
  1. 递归调用的是闭包函数,而非重新触发装饰器
    之后你调用fibo(n),实际上调用的是已经替换后的inner函数。递归里的fibo(n-1)、fibo(n-2)同样是调用这个inner函数,而不是再次执行memoization。

  2. 闭包保留了memory的引用
    inner函数是一个闭包,它会保留外层memoization函数中memory变量的引用。只要inner函数存在(也就是fibo变量还指向它),这个memory字典就会一直存在,不会被重置——所有对fibo的调用,包括递归调用,都会共享同一个memory。

你可以观察到程序只会在启动时打印一次{},之后再也不会打印空字典,这就直接证明了memoization只执行了一次,而非每次调用fibo都执行。

内容的提问来源于stack exchange,提问作者magnolia93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:19:59