2016-09-20 23 views
0
answers = [] 

def search(visit_order, nodes_to_visit, distance): 

    if len(nodes_to_visit) == 0: 
     print visit_order 
     answers.append(visit_order) 
     return 
    else: 
     for node in nodes_to_visit: 
      nodes_to_visit.remove(node) 
      visit_order.append(node) 
      search(visit_order, nodes_to_visit, 0) 
      visit_order.remove(node) 
      nodes_to_visit.append(node) 

search([],nodes, 0) 
print answers 

我有一个全局列表answers和递归函数,通过给定的nodes_to_visit不胜枚举时,有没有更多的nodes_to_visit这将增加visit_orderanswers列表。全球列表附加任何

当我在打印之前打印Visit_order时,我得到一个正确的值。但是,当我打印answers时,我只能得到列表,如[[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]。问题是什么?例如,如果我给搜索([],[1,2,3,4],0)作为输入,它应该给我类似于 [[3,1,2,4])的东西, [3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4], [3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4], [3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4], [3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4],[3,1,2,4], [3,1,2,4],[3,1,2,4],[3,1,2,4]] ,但它给了我[[],[],[],[],[] ,[],[],[],[],[],[],[],[],[],[],[],[] ],[],[]]。

+0

送东西([1,2,3],nodes,0) – Benjamin

+0

使用'search([1,2,3,4],[],0])' – mplf

+0

当循环内部搜索调用之后立即将它们从那里移除时,不能指望节点留在'visit_order'中。 – Sevanteri

回答

0

所以问题是你正在追加相同的对象answers然后你然后清空。检查[id(e) for e in answers]的输出,你应该看到相同的对象ID。一个快速的解决办法是通过使用answers.append(list(visit_order))answers.append(visit_order[:])

In [4]: search([],[1,2,3,4],0) 

In [5]: answers 
Out[5]: 
[[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[], 
[]] 

In [6]: [id(e) for e in answers] 
Out[6]: 
[140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400, 
140399731251400] 

In [7]: 

但是追加副本,如果我改变的功能:

def search(visit_order, nodes_to_visit, distance): 

    if len(nodes_to_visit) == 0: 
     answers.append(visit_order[:]) 
     return 
    else: 
     for node in nodes_to_visit: 
      nodes_to_visit.remove(node) 
      visit_order.append(node) 
      search(visit_order, nodes_to_visit, 0) 
      visit_order.remove(node) 
      nodes_to_visit.append(node) 

现在...

In [8]: answers = [] 

In [9]: search([],[1,2,3,4],0) 

In [10]: answers 
Out[10]: 
[[1, 2, 3, 4], 
[1, 2, 3, 4], 
[1, 3, 4, 2], 
[1, 3, 4, 2], 
[1, 3, 2, 4], 
[1, 3, 2, 4], 
[2, 4, 3, 1], 
[2, 4, 3, 1], 
[2, 3, 1, 4], 
[2, 3, 1, 4], 
[2, 3, 4, 1], 
[2, 3, 4, 1], 
[3, 1, 4, 2], 
[3, 1, 4, 2], 
[3, 4, 2, 1], 
[3, 4, 2, 1], 
[3, 4, 1, 2], 
[3, 4, 1, 2], 
[3, 2, 1, 4], 
[3, 2, 1, 4], 
[3, 1, 4, 2], 
[3, 1, 4, 2], 
[3, 1, 2, 4], 
[3, 1, 2, 4]] 

In [11]: