【发布时间】:2012-08-03 13:32:33
【问题描述】:
以下函数旨在用作存储已计算值的结果的装饰器。如果参数之前已经计算过,该函数将返回存储在cache 字典中的值:
def cached(f):
f.cache = {}
def _cachedf(*args):
if args not in f.cache:
f.cache[args] = f(*args)
return f.cache[args]
return _cachedf
我(错误地)意识到cache 不需要是函数对象的属性。事实上,下面的代码也可以工作:
def cached(f):
cache = {} # <---- not an attribute this time!
def _cachedf(*args):
if args not in cache:
cache[args] = f(*args)
return cache[args]
return _cachedf
我很难理解cache 对象如何在多个调用中保持不变。多次尝试调用多个缓存函数,都没有发现任何冲突或问题。
谁能帮我理解cache 变量是如何在_cachedf 函数返回后仍然存在的?
【问题讨论】:
标签: python decorator memoization internals