这是我的代码 -
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'时,我得到正确的输出,但我需要内部项目作为列表,我不会得到扩展。
答案 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(或复制)