Добавить объект в список питонов - PullRequest
25 голосов
/ 04 февраля 2010

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

Спасибо

Код:

arrayList = []

for x in allValues:


        result = model(x)

        arrayList.append(wM)

        wM.reset()

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

Ответы [ 4 ]

22 голосов
/ 04 февраля 2010

Ваша проблема похожа на эту:

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, который также там.

РЕДАКТИРОВАТЬ: Вот проблема:

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?

3 голосов
/ 04 февраля 2010

Вам необходимо создать копию списка, прежде чем изменять его содержимое.Быстрый ярлык для дублирования списка:

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() в соответствии с рекомендациями других.

2 голосов
/ 04 февраля 2010

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

0 голосов
/ 14 июня 2013

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

Когда вы сохраняете переменную в массиве, вы должны превратить ее в строку, просто введя 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...