为什么这些装饰变量不会被破坏? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

假设你有一个装饰器函数,它创建一个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函数后缓存会丢失,因为它超出了范围。我只会返回对装饰函数的引用。显然,事实并非如此。

有人能告诉我幕后发生了什么吗?

python python-3.x scope decorator python-decorators
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.