我一直在尝试学习 Python,虽然我热衷于在 Python 中使用闭包,但我一直无法让一些代码正常工作:
def memoize(fn):
def get(key):
return (False,)
def vset(key, value):
global get
oldget = get
def newget(ky):
if key==ky: return (True, value)
return oldget(ky)
get = newget
def mfun(*args):
cache = get(args)
if (cache[0]): return cache[1]
val = apply(fn, args)
vset(args, val)
return val
return mfun
def fib(x):
if x<2: return x
return fib(x-1)+fib(x-2)
def fibm(x):
if x<2: return x
return fibm(x-1)+fibm(x-2)
fibm = memoize(fibm)
基本上,这应该做的是使用闭包来维护函数的记忆状态。我意识到可能有很多更快、更容易阅读并且通常更“Pythonic”的方法来实现它;但是,我的目标是准确了解闭包在 Python 中的工作原理,以及它们与 Lisp 的不同之处,因此我对替代解决方案不感兴趣,只是为什么我的代码不起作用以及我能做些什么(如果有的话)来修复它。
我遇到的问题是当我尝试使用fibm
- Python 坚持get
没有定义:
Python 2.6.1 (r261:67515, Feb 1 2009, 11:39:55)
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import memoize
>>> memoize.fibm(35)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "memoize.py", line 14, in mfun
cache = get(args)
NameError: global name 'get' is not defined
>>>
鉴于我是 Python 新手,我不知道我是否做错了什么,或者这只是语言的限制。我希望是前者。:-)