访问递归函数

时间:2016-07-13 01:43:42

标签: python recursion immutability

我想生成我所拥有的权重列表的不同排列,并将所有排列添加到外部列表中。此代码正确生成排列,但即使我将其添加到外部列表,当我最后打印它时它是空的。

我认为这是引用调用,因为列表是可变的,因此对函数列表所做的任何更改都将反映在函数范围之外。

如何更正此代码,以便外部列表将包含每个排列的所有排列作为列表,在函数外部?

weight = [100,120,140]
outer_list = []
def func(outer_list,inner_list,weight,i,max_val):
    if len(inner_list) == max_val:
        print inner_list
        outer_list.append(inner_list)
        return
    inner_list.append(weight[i])
    func(outer_list,inner_list,weight,i,max_val)
    del inner_list[-1]
    for j in range(i+1,len(weight)):
        inner_list.append(weight[j])
        func(outer_list,inner_list,weight,i,max_val)
        del inner_list[-1]


inner_list = []
func(outer_list,inner_list,weight,0,2)
print outer_list 

当前输出:

[100, 100]
[100, 120]
[100, 140]
[120, 100]
[120, 120]
[120, 140]
[140, 100]
[140, 120]
[140, 140]
[[], [], [], [], [], [], [], [], []]  

1 个答案:

答案 0 :(得分:4)

您修改列表是正确的。您似乎错过了一件事:您将inner_list附加到outer_list,但您没有先复制它。它仍然是可变的,并且您附加的所有inner_list都是相同的对象。只需使用副本:

        outer_list.append(inner_list[:])

[:]是一个切片。由于我们没有开始,它默认为开头。由于我们省略了停止,因此默认为结束。因此,我们对整个列表进行了切片,从而产生浅拷贝。

在这种情况下只需要一个浅表副本,但请注意,如果inner_list包含可能发生变化的可变对象,则需要深层副本。要获得深层副本,您可以使用copy.deepcopy() function