递归Python函数中的持久对象
我正在尝试写一个递归函数,这个函数需要在递归的过程中存储和修改一个对象(比如一个集合)。我应该在函数内部使用全局变量吗?还有一个选择是修改或继承函数参数的类,这样它就可以保持这个持久的对象,但我觉得这样不太优雅。如果我完全放弃递归的话,我也可以使用栈来实现……
有没有什么更符合Python风格的方法呢?使用生成器可以解决这个问题吗?
6 个回答
2
把这个集合作为参数传递给递归方法,然后在里面进行修改,再把它传给下一步。复杂的对象是通过引用传递的。
4
对象是通过引用传递的。如果你只是想修改一个对象,可以在递归函数里面进行修改,这样修改的结果在全局范围内都是可见的。
但是,如果你想在递归函数里给一个变量赋值,并希望在函数返回后能看到这个值,那你不能仅仅用=
来给一个局部变量赋值。你可以做的是更新另一个对象的某个属性。
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
9
只需通过递归方法传递你的持久对象。
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)