2016-05-23 48 views
0

下面的代碼返回提供的數字的所有可能的排列。遞歸中的python列表的行爲

class Solution: 

    def permute(self, numbers, start, result): 
     if start == len(numbers): 
      print(numbers) 
      result.append(numbers[:]) 
      return 
     for i in range(start, len(numbers)): 
      numbers[start], numbers[i] = numbers[i], numbers[start] 
      self.permute(numbers, start + 1, result) 
      numbers[start], numbers[i] = numbers[i], numbers[start] 

    def solution(self, numbers): 
     result = [] 
     if not numbers or len(numbers) == 0: 
      return numbers 
     self.permute(numbers, 0, result) 
     return result 

res1 = Solution().solution([1, 2, 3]) 
print(res1) 

此實例的最終輸出將是

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]] 

但是當我稍微修改該置換功能,輸出的是完全不同的

def permute(self, numbers, start, result): 
     if start == len(numbers): 
      print(numbers) 
      result.append(numbers) #changing this line 
      return 
     for i in range(start, len(numbers)): 
      numbers[start], numbers[i] = numbers[i], numbers[start] 
      self.permute(numbers, start + 1, result) 
      numbers[start], numbers[i] = numbers[i], numbers[start] 

這給輸出

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] 

該項目工程,當我使用

result.append([x for x in numbers]) 

result.append(numbers[:]) 

但不是當我使用

result.append(numbers) 

有人可以幫助我理解爲什麼這是怎麼回事?

+0

作爲卡羅利·霍瓦斯的答案,當你做數字[:]它爲您創建一個新的數組。 – gipsy

+0

供參考:'itertools.permutations'爲你工作:) – Orelus

回答

2

如果不創建你所描述的技術的對象的副本,你把相同的對象列表中連連。

下面是一個簡短的例子來說明這個問題:

>>> a=[1,2] 
>>> b=[a,a] 
>>> a.append(3) 
>>> b    # [[1, 2, 3], [1, 2, 3]] 
+0

感謝您的快速回復:) – amarok