Python: проблема с добавлением списка - PullRequest
2 голосов
/ 31 января 2010

Вот мой код -

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]]

При добавлении нового элемента старый элемент заменяется новым. Эта тенденция продолжается. Может кто-нибудь сказать мне, почему это происходит. Я попытался использовать «добавить» вместо вставки, но получил тот же вывод. Однако, когда я использую «extension», я получаю правильный вывод, но мне нужны внутренние элементы в виде списков, которые я не получаю с расширением.

Ответы [ 9 ]

6 голосов
/ 31 января 2010

Вам нужно перепривязать cumulative_nodes_found_list в начале цикла, а не просто очистить его.

2 голосов
/ 31 января 2010

Это экстрасенсорная отладка в лучшем виде, поскольку вы фактически спрашиваете «что не так с моим кодом, который я не собираюсь вам показывать».

Все, что я могу сделать, это предположить.

Я предполагаю, что вы повторно используете объекты массива в памяти.

Другими словами, вы делаете что-то вроде этого:

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

Поскольку list1 указывает на один и тот же массив / список все время , и вы добавляете ссылку на объект, а не его копию, более поздние изменения приведут к появлению вашей копии измененное.

Другими словами, результат кода выше будет:

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

независимо от того, что было в списке до того, как вы добавили его в первый раз.

Попробуйте назначить изменяющемуся списку новый пустой объект каждый раз, когда вы входите в тело цикла, и посмотрите, исправляет ли это что-либо.

1 голос
/ 31 января 2010

Я предполагаю, что вы не назначаете cumulative_nodes_found_list новым списком каждый раз, а обновляете его содержимое. Таким образом, каждый раз в цикле вы добавляете одну и ту же ссылку на список в общий список. Поскольку ссылка в итоговом списке является одним и тем же объектом, при следующем обновлении этого списка в цикле он влияет на то, что, как вы надеялись, было последним значением цикла.

1 голос
/ 31 января 2010

Я считаю, что проблема в остальной части кода вашей программы. Элементы в 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 = []
1 голос
/ 31 января 2010

Списки являются изменяемыми объектами. Вы изменяете 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)
1 голос
/ 31 января 2010

Вы добавляете ссылку на cumulative_nodes_found_list к cumulative_nodes_found_total_list, но это всегда одна и та же ссылкаПереместите эту строку в тело цикла:

cumulative_nodes_found_list = []
0 голосов
/ 13 ноября 2016

Этот метод работал для меня. Как и вы, я пытался добавить / вставить список в другой список.

cumulative_nodes_found_total_list.insert(count,cumulative_nodes_found_list)

Но старые значения добавлялись к новым значениям. Поэтому вместо этого я попробовал это -

cumulative_nodes_found_total_list.insert(count,cumulative_nodes_found_list[:])
0 голосов
/ 06 марта 2014

"Операторы присваивания в Python не копируют объекты, они создают привязки между целью и объектом. "

Использовать глубокую копию (или копию)

0 голосов
/ 31 января 2010

Если вы хотите добавить в список, используйте вместо этого mylist.append (item).

Кроме того, если вы повторяете фиксированное число раз, лучше использовать цикл for:

for i in range(no_of_runs):
  # do stuff

Идея состоит в том, что range(no_of_runs) генерирует список [0, 1, 2, ..., 10] для no_of_runs = 10, а затем цикл повторяет свои значения.

Редактировать: это не решает проблему. Другие ответы в этой теме, однако. Это просто комментарий к стилю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...