用于修改可变参数的函数的 Python 内存

标签 python mutable memoization

假设我有一个修改列表参数和内存器装饰器的函数,例如:

@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/

相关文章:

Ruby Pascal 的带内存的三角形生成器

python - 如何在 Pandas 中转换数据框

.net - 为什么在using语句内的闭包内捕获可变结构变量会改变其局部行为?

f# - 结合内存和尾递归

ios - Swift 5 的 UnsafeMutablePointer 警告

java - 这是 Clojure 中可变状态的明智单子(monad)吗?

haskell - Haskell中动态规划的高效表

python - 正则表达式中的组是什么类型的容器

python - 打印 lxml.objectify.ObjectifiedElement?

python - 在 Python 中取消引用列表中的列表