在最近的一期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]
,而通常情况下,当您尝试在列表上为字典建立索引时会出现非哈希错误?在
谢谢你的澄清。在
因为它不是一个列表,而是一个元组。列表是可变的,因此不能在它们上定义有意义的哈希函数。但是元组是不可变的数据结构。在
因为}共享相同的名称上下文(闭包)。闭包持续存在是因为
memoize
和{memoized
包含对它的引用,然后返回它并将其分配给一个全局名称(这是decorator语句的效果)。通过闭包,所有捕获的值也将保持不变。在相关问题 更多 >
编程相关推荐