在递归函数中访问附加到列表的值
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.
我想生成我拥有的权重列表的不同排列,并将所有排列添加到外部列表。此代码正确生成排列,但即使我将它添加到外部列表,当我最后打印它时它也是空的。
我认为这是通过引用调用,因为列表是可变的,所以在函数中对列表所做的任何更改也会反映在函数范围之外。
我如何更正此代码,以便外部列表包含函数外部的所有排列,每个排列作为列表?
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.