0

看看这个片段:

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 保留其先前的元素。如果没有,那么如何保留元素?

4

3 回答 3

2

由于您发布的代码不是有效的 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
于 2013-10-17T12:57:59.907 回答
1

ds作为参数添加到函数中。

def recur(n, ds=None):
    ds = ds or {}
    #...
    recur(n, ds=ds)
于 2013-10-17T13:00:26.283 回答
0

像任何编程语言一样,在函数内部,您有仅在函数运行时才存在的变量:这些是局部变量ds此处为局部变量,仅在函数运行时存在。每当您再次运行该函数时,ds都不会像第一次那样运行(假设您正在运行同一程序的两个实例,即使您设置了相同的参数,也有两种不同的情况)。

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

  • 声明为全局(在任何函数之外)并在函数的第一行中ds引用它global ds
  • ds作为参数传递给函数(这是处理这种情况的最佳选择
于 2013-10-17T13:04:52.807 回答