Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归python函数中的持久对象_Python_Recursion_Persistent - Fatal编程技术网

递归python函数中的持久对象

递归python函数中的持久对象,python,recursion,persistent,Python,Recursion,Persistent,我正在尝试编写一个递归函数,该函数需要在对象(比如集合)递归时存储和修改对象。我应该在函数中使用全局名称吗?另一个选项是修改或继承函数参数的类,这样它就可以保持这个持久对象,但我觉得它并不优雅。如果我完全放弃递归,我也可以使用堆栈 有没有一种类似蟒蛇的方法?发电机能做到这一点吗 如果您传递的对象是可变的,那么在更深层的递归中对它的更改将在早期的递归中看到 对函数使用全局变量 将对象作为累加器传递: def recurse(foo, acc=None): acc = {} recu

我正在尝试编写一个递归函数,该函数需要在对象(比如集合)递归时存储和修改对象。我应该在函数中使用全局名称吗?另一个选项是修改或继承函数参数的类,这样它就可以保持这个持久对象,但我觉得它并不优雅。如果我完全放弃递归,我也可以使用堆栈


有没有一种类似蟒蛇的方法?发电机能做到这一点吗

如果您传递的对象是可变的,那么在更深层的递归中对它的更改将在早期的递归中看到

  • 对函数使用全局变量

  • 将对象作为累加器传递:

    def recurse(foo, acc=None):
        acc = {}
        recurse(acc)
    
  • 如果是容器(不是不可变的数据类型),则可以通过以下方式传递对象:

    import random
    
    def foo(bar=None, i=10):
        if bar is None:
            bar = set()
        if i == 0:
            return bar
        bar |= set(random.randint(1, 1000) for i in xrange(10))
        return foo(bar, i - 1)
    
    random_numbers_set = foo()
    

    (不要问我这意味着什么…我只是输入了随机的东西:p)

    将集合作为参数传递到递归方法中,然后在传递到下一步之前在那里修改它。复杂对象通过引用传递。

    对象通过引用传递。如果您只是修改一个对象,那么您可以在递归函数中进行修改,并且更改将是全局可见的

    如果您需要在递归函数中指定一个变量,并在函数返回后查看它,那么您不能仅使用
    =
    指定一个局部变量。您可以做的是更新另一个对象的字段

    class Accumulator: pass
    
    def foo():
        # Create accumulator
        acc = Accumulator()
        acc.value = 0
    
        # Define and call a recursive function that modifies accumulator
        def bar(n):
            if (n > 0): bar(n-1)
            acc.value = acc.value + 1
        bar(5)
    
        # Get accumulator
        return acc.value
    

    只需通过递归方法传递持久对象

    def recursivemethod(obj_to_act_on, persistent_obj=None):
    
        if persistent_obj == None:
            persistent_obj = set()
    
        # Act on your object
    
        return recursivemethod(newobj, persistent_obj)
    

    这取决于任务。听起来好像发电机可以工作,但我不知道你在做什么,所以我不能确定。请修复你的缩进。通常我不会抱怨,但在Python中这很重要。谢谢!我在发帖之前就看到过这种模式,但我想有些钉子需要更多的推动![是我的代码不起作用而不是模式]也没有叫做
    Set
    ,它是
    Set
    。如果persistent\u obj==None不应该
    如果persisten\u obj是None
    ?这就像一个全局变量,不是吗?foo只是简单地为bar声明并初始化acc。@kavic它是一个局部变量。该变量不在全局名称空间中,每个对foo的调用都有一个实例(而不是一个全局实例)。foo不仅仅初始化acc,它还从acc检索最终值。