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

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

Спасибо

Код:

arrayList = []

for x in allValues:


        result = model(x)

        arrayList.append(wM)

        wM.reset()

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

26
задан Gabriel 13 July 2014 в 19:04
поделиться

3 ответа

Ваша проблема похожа на следующую:

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 (что мне кажется ужасным недостатком дизайна)? И почему вы выбрасываете результат ?

22
ответ дан 28 November 2019 в 07:54
поделиться

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

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 () , как предлагали другие.

3
ответ дан 28 November 2019 в 07:54
поделиться

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

2
ответ дан 28 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: