我想生成我所拥有的权重列表的不同排列,并将所有排列添加到外部列表中。此代码正确生成排列,但即使我将其添加到外部列表,当我最后打印它时它是空的。
我认为这是引用调用,因为列表是可变的,因此对函数列表所做的任何更改都将反映在函数范围之外。
如何更正此代码,以便外部列表将包含每个排列的所有排列作为列表,在函数外部?
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]
[[], [], [], [], [], [], [], [], []]
答案 0 :(得分:4)
您修改列表是正确的。您似乎错过了一件事:您将inner_list
附加到outer_list
,但您没有先复制它。它仍然是可变的,并且您附加的所有inner_list
都是相同的对象。只需使用副本:
outer_list.append(inner_list[:])
[:]
是一个切片。由于我们没有开始,它默认为开头。由于我们省略了停止,因此默认为结束。因此,我们对整个列表进行了切片,从而产生浅拷贝。
在这种情况下只需要一个浅表副本,但请注意,如果inner_list
包含可能发生变化的可变对象,则需要深层副本。要获得深层副本,您可以使用copy.deepcopy()
function。