Я пытаюсь добавить объект к списку, но так как я добавляю фактический объект, когда я пытаюсь сбросить список после этого, все значения в списке сбрасываются. Существует ли фактический путь, как я могу добавить объект монитора к списку и изменить значения и не влиять на тех, я уже сохранил в списке?
Спасибо
Код:
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(wM)
wM.reset()
где wM является классом монитора - который вычисляется / разработанный в образцовом методе
Ваша проблема похожа на следующую:
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.deepcopy
, который тоже там есть.
РЕДАКТИРОВАТЬ: Вот проблема:
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
(что мне кажется ужасным недостатком дизайна)? И почему вы выбрасываете результат
?
Вам необходимо создать копию списка, прежде чем изменять его содержимое. Быстрый ярлык для дублирования списка:
mylist[:]
Пример:
>>> first = [1,2,3]
>>> second = first[:]
>>> second.append(4)
>>> first
[1, 2, 3]
>>> second
[1, 2, 3, 4]
И показать поведение по умолчанию, которое изменит исходный список (поскольку имя в Python является просто ссылкой на базовый объект):
>>> first = [1,2,3]
>>> second = first
>>> second.append(4)
>>> first
[1, 2, 3, 4]
>>> second
[1, 2, 3, 4]
Примечание что это работает только для списков. Если вам нужно дублировать содержимое словаря, вы должны использовать copy.deepcopy ()
, как предлагали другие.
хотя вы и должны показать, как выглядит ваш код, но я думаю, что этот сценарий очень распространен. See copy/deepcopy