繁体   English   中英

试图理解Python memoization代码片段

[英]Trying to understand Python memoization code snippet

在最近的Hacker Newsletter问题中, 这篇关于Python中装饰器的非常有用的文章已被链接。 我喜欢这篇文章,我想我理解了大多数装饰器的例子。 但是,在非装饰器的memoization示例中,我对代码非常困惑:

def memoize(fn):
    stored_results = {}

    def memoized(*args):
        try:
            # try to get the cached result
            return stored_results[args]
        except KeyError:
            # nothing was cached for those args. let's fix that.
            result = stored_results[args] = fn(*args)
            return result

    return memoized

我很困惑这个函数如何创建一个附加到的持久字典stored_results 重新阅读后,将其复制/粘贴到我的编辑器中并使用它,并在网上寻求帮助,我仍然不明白stored_results[args] = fn(*args)的语法是什么。

(1)文章建议上面的代码将返回函数,但现在它将在执行新的参数之前首先搜索字典。 这是怎么发生的? 为什么不stored_results只是本地memoize 返回memoized时为什么不会被销毁?

(2)解释通过*args传递参数的其他问题或网络资源的链接也会有所帮助。 如果*args是参数列表 ,为什么我们可以使用语法stored_results[args] ,通常在尝试索引列表中的字典时会出现不可出错的错误?

感谢任何澄清的想法。

如果*args是参数列表,为什么我们可以使用语法stored_results[args] ,通常在尝试索引列表中的字典时会出现不可出错的错误?

因为它不是列表,所以它是一个元组。 列表是可变的,因此您无法在它们上定义有意义的哈希函数。 然而,元组是不可变的数据结构。

为什么不stored_results只是本地memoize 返回memoized时为什么不会被销毁?

因为memoizememoized共享相同的名称上下文(闭包)。 闭包持续存在,因为memoized持有memoized的引用并返回它并将其分配给全局名称(这是装饰器语句的效果)。 关闭时,所有捕获的值也会持续存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM