全局列表没有附加任何内容

Global list is appending nothing

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 列表的递归函数,它将在没有更多列表时将 visit_order 添加到 answers 列表nodes_to_visit

当我在追加之前打印 Visit_order 时,我得到了正确的值。但是,当我打印 answers 时,我只得到列表的列表,例如 [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]。有什么问题?

例如,如果我将 search([],[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]] 但它给了我 [[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[] []、[]、[]、[]、[]、[]、[]、[]、[]]。

所以问题是您将 相同的对象 附加到 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]: