ely*_*ely 4 python function memoization
在最近的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
Run Code Online (Sandbox Code Playgroud)
我很困惑这个函数如何创建一个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返回时为什么不被销毁?
因为memoize和memoized共享相同的名称上下文(闭包).闭包持续存在,因为memoized持有对它的引用并返回它并将其分配给全局名称(这是装饰器语句的效果).关闭时,所有捕获的值也会持续存在.
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |