Python递归函数不会更改main()中定义的列表

时间:2018-09-17 13:28:53

标签: python python-3.x

在这里,我编写了一个递归函数来查找列表的排列。

def backtrack(arr,tmp):
   if len(tmp)==len(arr):
       res.append(tmp)
       #==print res here==
       print(res)
   else:
       for i in range(len(arr)):
           if arr[i] in tmp: continue
           tmp.append(arr[i])
           backtrack(arr,tmp)
           tmp.pop()
if __name__ == '__main__':
   points=[1,2,3]
   res=[]
   tmp=[]
   backtrack(points,tmp)
   print(res)
   #code result
   #[[1, 3, 2], [1, 3, 2]]
   #[[2, 1, 3], [2, 1, 3], [2, 1, 3]]
   #[[2, 3, 1], [2, 3, 1], [2, 3, 1], [2, 3, 1]]
   #[[3, 1, 2], [3, 1, 2], [3, 1, 2], [3, 1, 2], [3, 1, 2]]
   #[[3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1], [3, 2, 1]]
   #[[], [], [], [], [], []]

我不知道为什么将main()中定义的列表'res'传递给递归函数时不会更新。关于如何更新“ res”的任何建议?

1 个答案:

答案 0 :(得分:3)

当您这样做:

res.append(tmp)

您将在全局列表res上附加对列表tmp的引用。以后对tmp所做的任何更改都将通过res可见,因为它仅包含对同一tmp列表的多个引用。

相反,您可能想附加tmp的副本:

res.append(list(tmp))

进行更改,您的输出现在是:

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

或者,您可以将tmp列表转换为tuple

res.append(tuple(tmp))

如果这样做,则该选项与itertools.permutations返回的输出相同:

>>> import itertools
>>> list(itertools.permutations([1,2,3]))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]