全局列表没有附加任何内容
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]:
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]: