Как данные могут оставаться постоянными при нескольких вызовах декорированной функции?

Следующая функция предназначена для использования в качестве декоратора, который сохраняет результаты уже вычисленных значений. Если аргумент уже был рассчитан ранее, функция вернет значение, хранящееся в словаре 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?

6
задан Sarath Sadasivan Pillai 2 February 2017 в 08:09
поделиться