Python:递归:通过调用向下传递一些值

Python:递归:通过调用向下传递一些值,python,Python,请看这个片段: def recur(n): ds = {} x=do_foo(n) if foo(n): ds[n] = recur(x) else: return x 我想问的是,第一次迭代时的ds是空的,如果为真,它会添加一些条件。如果它递归,则在第二次迭代时,它在ds[n]=recur(x)处进入,因此在第n次迭代中,ds再次被定义为ds={}。。或ds保留其以前的元素。如果没有,那么如何保留元素?很难说出您在这里想要什么,因为您发布的代码不是有效的Pyt

请看这个片段:

def recur(n):
    ds = {}
    x=do_foo(n)
    if foo(n): ds[n] = recur(x)
    else: return x

我想问的是,第一次迭代时的ds是空的,如果为真,它会添加一些条件。如果它递归,则在第二次迭代时,它在
ds[n]=recur(x)
处进入,因此在第n次迭代中,ds再次被定义为ds={}。。或ds保留其以前的元素。如果没有,那么如何保留元素?

很难说出您在这里想要什么,因为您发布的代码不是有效的Python,但我认为您正在询问如何通过调用向下传递某种缓存

实现这一点的方法是使缓存成为可选参数。这样,您可以在不使用缓存的情况下调用函数,也可以将其传递给递归调用

def recur(n, ds=None):
    if ds is None: ds = {}
    x=do_foo(n)
    if foo(n):
        ds[n] = recur(x, ds)
    else:
        return x
或者,使用一个类来完全控制缓存将持续多长时间:

class Bar(object):
    def __init__(self):
        self.ds = {}

    def recur(self, n):
        x=do_foo(n)
        if foo(n):
            self.ds[n] = self.recur(x)
        else:
            return x

ds
作为参数添加到函数中

def recur(n, ds=None):
    ds = ds or {}
    #...
    recur(n, ds=ds)

与任何编程语言一样,在函数中,变量只有在函数运行时才存在:它们是
ds
在这里是一个局部变量,仅在函数运行时存在。每当您再次运行函数时,
ds
将不会作为第一个函数(假设您正在运行同一程序的两个实例,即使您设置了相同的参数,也有两种不同的情况)

要解决您的问题,有两种方法:

  • ds
    声明为全局(在任何函数之外),并在函数的第一行将其称为
    global ds
  • ds
    作为参数传递给函数(这是处理这种情况的最佳选择)

请将其更改为有效的python。如果我甚至不能理解你的代码的目的,我也帮不了你。或者至少给出一个你正在尝试做的好例子…是的,如何通过调用向下传递某种缓存是我正在寻找的。我曾想过将其作为arg传递,但在其他地方看到过一些其他方法。你不认为ds={}可以声明为全局的,尽管你不建议这样做?使用全局的似乎是一个非常糟糕的主意。要使用的两种技术是将其作为参数传递,或者使函数成为类实例上的方法并将其保存为属性。与类相比,我更喜欢使用memoize decorator。谢谢你的帮助!