假设我有一个修改列表参数和内存器装饰器的函数,例如:
@memoizer
def add_1_to_list(list):
for i in range(len(list)):
list[i] += 1
return list
在我的主程序中,我有
list = [1, 1, 1, 1]
add_1_to_list(list)
print list
如果我的 memoizer 类只缓存返回值并设置 add_1_to_list 返回相同的值,那么当我第一次运行主程序时,它将打印 [2, 2, 2, 2]
,而第二次,它将打印 [1, 1, 1, 1]
,因为 list 是可变的。
是否有任何解决方案可以让 memoizer 类来检测函数是否修改了参数,这样我们就可以记下它并保存修改后的参数?我可以通过在 memoizer 类中调用之前和之后打印参数来直观地看到它,但是不知道参数是什么类型以及它们是否可变/不可变,似乎很难测试参数是否已被修改.
最佳答案
您的问题唯一可能的答案是不。您正在不应该使用记忆化的地方使用记忆化。
仅记住没有副作用的函数,否则你就是在自找麻烦。
Are there any solutions to get a memoizer class to detect that the function modifies an argument?
检测可变性不是内存器的责任,程序员有责任决定是否将内存器应用于函数。
that way we can note it and save modified arguments
在我看来,这听起来过于复杂。此外,如果您“保存”修改后的参数,您最终会保留对它们的引用,从而防止它们被释放。
关于用于修改可变参数的函数的 Python 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21617001/