【问题标题】:Where does a memoized python function's cache live?记忆化的 Python 函数的缓存在哪里?
【发布时间】:2017-06-27 23:13:13
【问题描述】:

下面是一个记忆阶乘函数的简单示例。它工作正常,我理解基本概念,但有一个细节让我感到困惑。变量memory 驻留在哪里?为什么memoize() 执行完成后它仍然存在?它似乎不是一个全局变量,因为我不能做类似print memory 的事情。这是怎么回事?

def memoize(f):
    memory = {}
    def memoized(*args):
        if args not in memory:
            memory[args] = f(*args)
        return memory[args]
    return memoized

@memoize
def fact(n):
    if n <= 1:
        return 1
    return n * fact(n - 1)

print fact(10)

【问题讨论】:

  • 它存在于closure包装fact
  • 当你在另一个函数中声明一个函数时,内部函数可以看到所有在外部函数中声明的变量。它被称为闭包。

标签: python python-2.7 memoization


【解决方案1】:

memory 字典存储在“闭包”中,该闭包是在函数从封闭函数引用局部变量时创建的。闭包包装了这些引用。

您可以看到字典为fact.__closure__[1].cell_contents。 (fact.__closure__[0].cell_contents 是原始的未修饰函数,也被修饰函数以类似的方式通过变量f 引用。)

【讨论】:

  • 很好,我没有意识到你可以这么容易地反省闭包!
猜你喜欢
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2023-03-30
相关资源
最近更新 更多