Подтвердить что ты не робот

Добавить объект в список python

Я пытаюсь добавить объект в список, но поскольку я добавляю фактический объект при попытке reset списка после этого, все значения в списке reset. Есть ли реальный способ, как я могу добавить объект монитора в список и изменить значения и не повлиять на те, которые я уже сохранил в списке?

Спасибо

код:

arrayList = []

for x in allValues:


        result = model(x)

        arrayList.append(wM)

        wM.reset()

где wM - это класс монитора, который вычисляется/разрабатывается в модельном методе

4b9b3361

Ответ 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()