我有一个记忆化装饰,看起来像这样:Memoizing装饰保持存储的值
def memoize(obj):
from functools import wraps
cache = {}
@wraps(obj)
def memoizer(*args, **kwargs):
if args not in cache:
cache[args] = obj(*args, **kwargs)
return cache[args]
return memoizer
但是,我不知道这个功能的正常使用,因为它好像对我来说,重新创建cache
作为一个空的字典每调用装饰函数的时间。当我用一个简单的斐波那契函数测试它时,它似乎确实正确记忆。那么cache
每次都不会重新创建?
的包括该行python wiki has a version:
cache = obj.cache = {}
所以我不知道这是什么一样。我猜python函数是对象,所以它正在创建一个与该函数关联的新属性,并且每次调用该函数时都会公开可用/可用。
在任一版本中,如果我重复调用函数,如递归定义或仅通过重复调用,缓存如何处理?它是否与函数关联,它是否成为“全局”变量或其他东西?
“每次” - 每个*什么*?每次调用memoize时,它都会创建一个新的'cache',但每次调用memoized函数时都不会调用memoize。 – user2357112