当使用像 lru_cache 这样的 functools 缓存函数时,内部函数不会更新非局部变量的值。同样的方法在没有装饰器的情况下也有效。
使用缓存装饰器时非局部变量是否没有更新?另外,如果我必须更新非局部变量但还要存储结果以避免重复工作,该怎么办?或者我是否需要从缓存函数中返回答案?
例如。以下未正确更新非局部变量的值
def foo(x):
outer_var=0
@lru_cache
def bar(i):
nonlocal outer_var
if condition:
outer_var+=1
else:
bar(i+1)
bar(x)
return outer_var
背景
我正在尝试解码方式问题,该问题正在寻找可以将一串数字解释为字母的方式数量。我从第一个字母开始,采取一两个步骤并检查它们是否有效。到达字符串末尾时,我更新了一个非局部变量,该变量存储了可能的方式数。此方法在不使用 lru_cache 的情况下给出正确答案,但在使用缓存时失败。我返回值的另一种方法正在工作,但我想检查如何在使用记忆装饰器时更新非局部变量。
我的错误代码:
ways=0
@lru_cache(None) # works well without this
def recurse(i):
nonlocal ways
if i==len(s):
ways+=1
elif i<len(s):
if 1<=int(s[i])<=9:
recurse(i+1)
if i+2<=len(s) and 10<=int(s[i:i+2])<=26:
recurse(i+2)
return
recurse(0)
return ways
公认的解决方案:
@lru_cache(None)
def recurse(i):
if i==len(s):
return 1
elif i<len(s):
ans=0
if 1<=int(s[i])<=9:
ans+= recurse(i+1)
if i+2<=len(s) and 10<=int(s[i:i+2])<=26:
ans+= recurse(i+2)
return ans
return recurse(0)