2017-03-18 48 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)] 

完成!