Python:list append的问题

时间:2010-01-31 11:55:27

标签: python

这是我的代码 -

cumulative_nodes_found_list = []
cumulative_nodes_found_total_list = []

no_of_runs = 10

count = 0

while count < no_of_runs:

 #My program code

 print 'cumulative_nodes_found_list - ' + str(cumulative_nodes_found_list)
 cumulative_nodes_found_total_list.insert(count,cumulative_nodes_found_list)
 print 'cumulative_nodes_found_total_list - ' + str(cumulative_nodes_found_total_list)
 count = count + 1

以下是输出的一部分 -

#count = 0
cumulative_nodes_found_list - [0.0, 0.4693999, 0.6482, 0.6927999999, 0.7208999999, 0.7561999999, 0.783399999, 0.813999999, 0.8300999999, 0.8498, 0.8621999999]

cumulative_nodes_found_total_list - [[0.0, 0.4693999, 0.6482, 0.6927999999, 0.7208999999, 0.7561999999, 0.783399999, 0.813999999, 0.8300999999, 0.8498, 0.8621999999]]

#count = 1
cumulative_nodes_found_list - [0.0, 0.55979999999999996, 0.66220000000000001, 0.69479999999999997, 0.72040000000000004, 0.75380000000000003, 0.77629999999999999, 0.79679999999999995, 0.82979999999999998, 0.84850000000000003, 0.85760000000000003]

cumulative_nodes_found_total_list -[[0.0, 0.55979999999999996, 0.66220000000000001, 0.69479999999999997, 0.72040000000000004, 0.75380000000000003, 0.77629999999999999, 0.79679999999999995, 0.82979999999999998, 0.84850000000000003, 0.85760000000000003], 
[0.0, 0.55979999999999996, 0.66220000000000001, 0.69479999999999997, 0.72040000000000004, 0.75380000000000003, 0.77629999999999999, 0.79679999999999995, 0.82979999999999998, 0.84850000000000003, 0.85760000000000003]]

随着新项目的追加,旧项目将被新项目替换。这种趋势还在继 任何人都可以告诉我为什么会这样。我尝试使用'append'代替insert但获得了相同的输出。然而,当我使用'extend'时,我得到正确的输出,但我需要内部项目作为列表,我不会得到扩展。

9 个答案:

答案 0 :(得分:6)

您需要在循环开始时重新绑定cumulative_nodes_found_list,而不是仅仅清除它。

答案 1 :(得分:2)

这是精神调试的最佳状态,因为你有效地问“我的代码有什么问题,我不打算给你看”。

我所能做的只是假设。

我假设您正在重新使用内存中的数组对象。

换句话说,你做这样的事情:

list1.insert(0, list2)
list2.clear()
list2.append(10)
list2.append(15)
list1.insert(0, list2)

由于list1指向同一个数组/列表整个时间,并且您要添加对该对象的引用,而不是它的副本,稍后更改将使其成为看来你的副本发生了变化。

换句话说,上面代码的结果将是:

[[10, 15], [10, 15]]

无论第一次添加之前列表中的内容是什么。

每次进入循环体时,尝试为更改列表指定一个新的空对象,看看是否有任何修复。

答案 2 :(得分:1)

您要将cumulative_nodes_found_list的引用添加到cumulative_nodes_found_total_list,但每次都是相同的引用。将此行移动到循环体中:

cumulative_nodes_found_list = []

答案 3 :(得分:1)

列表是可变对象。你在代码中改变cumulative_nodes_found_list,所以在前一次运行中添加到总列表中的对象也会发生变异,因为它们是同一个对象。

要制作副本以插入总数:

for count in xrange(no_of_runs):
   # ...
   cumulative_nodes_found_total_list.append(list(cumulative_nodes_found_list))

...或在每次迭代时重置列表:

for count in xrange(no_of_runs):
   cumulative_nodes_found_list = [] # creates a NEW list for this iteration
   # ...
   cumulative_nodes_found_total_list.append(cumulative_nodes_found_list)

答案 4 :(得分:1)

我认为问题出在你的程序代码的其余部分。 cummulative_nodes_found_list中的项目每次都在循环中就地替换。

我假设你正在做这样的事情:

while count < no_of_runs:
    cummulative_nodes_found_list.clear()
    #fill up the list with values using whatever program logic you have
    cummulative_nodes_found_list.append(1.1)
    cummulative_nodes_found_list.append(2.1)
    print 'cumulative_nodes_found_list - ' + str(cumulative_nodes_found_list)
    cumulative_nodes_found_total_list.insert(count,cumulative_nodes_found_list)
    print 'cumulative_nodes_found_total_list - ' + str(cumulative_nodes_found_total_list)
    count = count + 1

如果这是你正在做的事情,那么不要使用'clear()'来清除列表,而是创建一个新列表:

即,用

替换cummulative_nodes_found_list.clear()
 cummulative_nodes_found_list = []

答案 5 :(得分:1)

我的猜测是,您不是每次都将cumulative_nodes_found_list指定为新列表,而是更新其内容。因此,每次循环时,您都会将相同的列表引用添加到总列表中。由于总计列表中的引用是同一个对象,因此当您下次循环时更新此列表时,它会影响您希望的最后一个循环值。

答案 6 :(得分:0)

如果要附加到列表,请改用mylist.append(item)。

此外,如果您迭代固定次数,最好使用for循环:

for i in range(no_of_runs):
  # do stuff

我的想法是,range(no_of_runs)为no_of_runs = 10生成列表[0, 1, 2, ..., 10],然后循环迭代其值。

编辑:这不能解决问题。但是,此线程中的其他答案。这只是对风格的评论。

答案 7 :(得分:0)

这种方法对我有用。就像你一样,我试图将列表附加/插入到另一个列表中。

cumulative_nodes_found_total_list.insert(count,cumulative_nodes_found_list)

但旧值被新值附加。所以我尝试了这个 -

cumulative_nodes_found_total_list.insert(count,cumulative_nodes_found_list[:])

答案 8 :(得分:-1)

  

“Python中的赋值语句不会复制它们创建的对象   目标和对象之间的绑定。“

使用deepcopy(或复制)