在递归函数中访问附加到列表的值

Accessing values that are appended to a list in a recursive function

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

我认为这是通过引用调用,因为列表是可变的,所以在函数中对列表所做的任何更改也会反映在函数范围之外。

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

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]
[[], [], [], [], [], [], [], [], []]  

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

        outer_list.append(inner_list[:])

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

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