这个问题在这里已有答案:
假设你有一个装饰器函数,它创建一个dict来存储已经计算过的结果,这是出于性能原因。例如。:
def memoize(func):
cache = dict()
def memoized_func(*args, **kwargs):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return memoized_func
当我用myfunc = memoize(myfunc)
装饰一个函数时,我很难理解为什么这个有效。
我最初认为在返回memoized函数后缓存会丢失,因为它超出了范围。我只会返回对装饰函数的引用。显然,事实并非如此。
有人能告诉我幕后发生了什么吗?
装饰器功能具有存储缓存的自身非本地范围。函数调用后,此范围不会破坏。更多信息有https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement