Добавить объект в список python
Я пытаюсь добавить объект в список, но поскольку я добавляю фактический объект при попытке reset списка после этого, все значения в списке reset.
Есть ли реальный способ, как я могу добавить объект монитора в список и изменить значения и не повлиять на те, которые я уже сохранил в списке?
Спасибо
код:
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(wM)
wM.reset()
где wM - это класс монитора, который вычисляется/разрабатывается в модельном методе
Ответы
Ответ 1
Является ли ваша проблема похожей на это:
l = [[0]] * 4
l[0][0] += 1
print l # prints "[[1], [1], [1], [1]]"
Если это так, вам просто нужно скопировать объекты при их сохранении:
import copy
l = [copy.copy(x) for x in [[0]] * 4]
l[0][0] += 1
print l # prints "[[1], [0], [0], [0]]"
Объекты, о которых идет речь, должны реализовать метод __copy__
для копирования объектов. См. Документацию для copy
. Вы также можете быть заинтересованы в copy.deepcopy
, который также существует.
EDIT: Здесь проблема:
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(wM) # appends the wM object to the list
wM.reset() # clears the wM object
Вам нужно добавить копию:
import copy
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(copy.copy(wM)) # appends a copy to the list
wM.reset() # clears the wM object
Но я все еще смущен, откуда приходит wM
. Разве вы не будете копировать один и тот же объект wM
снова и снова, кроме как очистить его после первого раза, так что все остальное будет пустым? Или model()
изменить wM
(что звучит как ужасная ошибка дизайна для меня)? И почему вы выбрасываете result
?
Ответ 2
Вам необходимо создать копию списка, прежде чем изменять его содержимое. Быстрый ярлык для дублирования списка таков:
mylist[:]
Пример:
>>> first = [1,2,3]
>>> second = first[:]
>>> second.append(4)
>>> first
[1, 2, 3]
>>> second
[1, 2, 3, 4]
И чтобы показать поведение по умолчанию, которое изменило бы список orignal (поскольку имя в Python является только ссылкой на базовый объект):
>>> first = [1,2,3]
>>> second = first
>>> second.append(4)
>>> first
[1, 2, 3, 4]
>>> second
[1, 2, 3, 4]
Обратите внимание, что это работает только для списков. Если вам нужно дублировать содержимое словаря, вы должны использовать copy.deepcopy()
, как это было предложено другими.
Ответ 3
пока вы должны показать, как выглядит ваш код, что дает проблему, я думаю, что этот сценарий очень распространен. См. copy/deepcopy
Ответ 4
Если я прав, полагая, что вы добавляете переменную в массив, но когда вы меняете эту переменную за пределами массива, она также изменяется внутри массива, но вы не хотите этого, тогда это действительно простое решение.
Когда вы сохраняете переменную в массиве, вы должны превратить ее в строку, просто поместив str (variablename). Например:
array.append(str(variablename))
Используя этот метод, ваш код должен выглядеть так:
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(str(wM)) #this is the only line that is changed.
wM.reset()