尝试理解Python记忆代码snipp

2024-06-16 14:42:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在最近的一期Hacker Newsletter中,链接了this very useful article关于Python中的decorators。我想我最喜欢这篇文章的例子。但是,在non-decorator memorization示例中,我对以下代码非常困惑:

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)指向其他问题或web资源的链接,以解释此处使用*args传递的参数,也会很有帮助。如果*args是一个由参数组成的列表,那么为什么我们可以使用语法stored_results[args],而通常情况下,当您尝试在列表上为字典建立索引时会出现非哈希错误?在

谢谢你的澄清。在


Tags: 代码参数return字典链接defargsresult
1条回答
网友
1楼 · 发布于 2024-06-16 14:42:34

If *args is a list of arguments, why can we use the syntax stored_results[args], when normally you get a non-hashable error when trying to index a dictionary on a list?

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

Why isn't stored_results just local to memoize? Why doesn't it get destroyed when memoized is returned?

因为memoize和{}共享相同的名称上下文(闭包)。闭包持续存在是因为memoized包含对它的引用,然后返回它并将其分配给一个全局名称(这是decorator语句的效果)。通过闭包,所有捕获的值也将保持不变。在

相关问题 更多 >