为什么这些装饰变量不会被破坏?

时间:2018-09-03 07:40:51

标签: python python-3.x scope decorator python-decorators

假设您有一个装饰器函数,该函数创建一个字典来存储由于性能原因而已计算的结果。例如:

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)装饰函数时,我很难理解它为什么起作用。

我起初以为,缓存超出范围后,在返回备注函数后会丢失缓存。我只会返回对装饰函数的引用。显然,事实并非如此。

有人可以告诉我幕后发生的事情吗?

1 个答案:

答案 0 :(得分:0)

装饰器函数在存储缓存的地方具有自身的非本地范围。该范围不会在函数调用后销毁。有更多信息https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement