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

Python 访问递归函数中附加到列表的值,python,recursion,immutability,Python,Recursion,Immutability,我想生成我拥有的权重列表的不同排列,并将所有排列添加到外部列表中。这段代码正确地生成排列,但即使我将其添加到外部列表中,当我最后打印它时,它也是空的 我认为这是通过引用调用的,因为列表是可变的,所以对函数中的列表所做的任何更改也将反映在函数的范围之外 如何更正此代码,以便外部列表将包含所有置换,每个置换作为一个列表,位于函数之外 weight = [100,120,140] outer_list = [] def func(outer_list,inner_list,weight,i,max_v

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

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

如何更正此代码,以便外部列表将包含所有置换,每个置换作为一个列表,位于函数之外

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 
电流输出:

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

修改列表是正确的。您似乎遗漏了一件事:您将
内部列表
附加到
外部列表
,但您没有先复制它。它仍然是可变的,并且您附加的所有
内部\u列表都是相同的对象。只需使用副本即可:

        outer_list.append(inner_list[:])
[:]
是一个切片。由于我们省略了开始,它默认为开始。由于我们省略了停止,它默认为结束。因此,我们对整个列表做了一个切片,结果得到了一个浅拷贝


在这种情况下,只需要一个浅拷贝,但请注意,如果
internal_list
包含也可能发生更改的可变对象,则需要一个深拷贝。要获得深度拷贝,您可以使用。

好的捕获!我承认,我在这件事上被难住了。啊,状态和可变数据的陷阱……可能值得在你的帖子中指出,
[:]
只创建了一个浅拷贝。虽然这对这个特定的问题很有效,但我认为应该为将来偶然发现这个问题并具有嵌套数据结构的其他人提供信息。@PierceDarragh:这当然值得指出,现在已经在帖子中了。@zondo非常感谢!