2017-03-18 275 views
0

有人可以解释如何解决以下问题吗?我读过一些解释,但无法让我的头...Python:在递归函数中使用append - 覆盖以前的元素

非常感谢提前!

k = 2     # number of possible values for each element, in this case 0 or 1 
length = 3    # length of list 
result = [0] * length # initialise list 
results = [] 

# generate permutations of list 
def permutations(i, k, length): 
    j = 0 
    while j < k: 
     result[i] = j 
     if i == length - 1: 
      print("Result: ", result) 
      results.append(result) 
      print("Results: ", results) 
     else: 
      permutations(i + 1, k, length) 
     j += 1 

permutations(0, k, length) 

下面的输出。问题是列表中的所有元素都被覆盖...

Result: [0, 0, 0] 
Results: [[0, 0, 0]] 
Result: [0, 0, 1] 
Results: [[0, 0, 1], [0, 0, 1]] 
Result: [0, 1, 0] 
Results: [[0, 1, 0], [0, 1, 0], [0, 1, 0]] 
Result: [0, 1, 1] 
Results: [[0, 1, 1], [0, 1, 1], [0, 1, 1], [0, 1, 1]] 
Result: [1, 0, 0] 
Results: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] 
Result: [1, 0, 1] 
Results: [[1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1]] 
Result: [1, 1, 0] 
Results: [[1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0]] 
Result: [1, 1, 1] 
Results: [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]] 
+0

您的预期输出是什么样子? – klutt

回答

1

您每次都追加相同的列表。通过该引用修改列表会将更改传播到列表对象所在的每个位置;它是相同的列表。

你应该附加一个浅拷贝代替,因此参考result仅修改当前的列表:

... 
results.append(result[:]) 

否则,你可以在函数的开始,从而每次递归调用创建一个新的列表对象都有自己的名单:

def permutations(i, k, length): 
    result = [] 
    ... 
+0

为什么你使用'result [:]'而不是'result'? – elena

+2

'result [:]'创建一个没有被'result'名称引用的新列表 –

+0

非常感谢,'result [:]'工作。 – Andras

0

我相信改变results.append(结果)result.append(结果[:])应该解决这个问题。这是因为列表可变性

+0

这工作,非常感谢。 – Andras

+0

乐于帮助@Andras –

0

您实现的内容可以描述为重复排列或cartesian product

k ** length列表或元组可以这种方式生成。

与任意组合,排列或产品,itertools可以帮助你:

from itertools import product 

k = 2     # number of possible values for each element, in this case 0 or 1 
length = 3    # length of list 

print(list(product(range(k), repeat=length))) 
#[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 

完成!