Python: новый объект теряет атрибуты массива - PullRequest
0 голосов
/ 12 июля 2020

В настоящее время я пишу программу python, которая должна создать массив объектов класса, которые были созданы.

Проблема, с которой я столкнулся, заключается в том, что класс имеет массив в качестве атрибута. После того, как я выполняю myArray.clear (), объект класса теряет значения массива. Остальные значения не теряются. Я знаю, что это связано со ссылкой на массив, но я не знаю, как это исправить.

Пример кода:

Class

class Testclass(object):
   def __init__(self, array, normalValue):
    self._array= array
    self._normalValue= normalValue
    

Main

if __name__=="main":
   exampleIteratorArray = ["Ex1", "Ex2", "Ex3"]
   objectArray = []
   for i, value in enumerate(exampleIteratorArray):
         exampleArray = [i, i+1, i+2]
         objectArray.append(Testclass(exampleArray, value))
         exampleArray.clear()              #I have to do this because I want to check the state depending on the value of this variable (in my main code)
                                            #After the exampleArray.clear(), the objectArray loses the exampleArray values but not the i value

Поэтому я хотел знать, как я могу добавлять объекты в массив без потери значений после каждой итерации. Заранее спасибо! :)

Редактировать

Как заметил Азро, я создаю новую переменную из exampleArray на каждой итерации, поэтому мне не нужно очищать массив.

1 Ответ

2 голосов
/ 12 июля 2020

В Python назначение списка относится к тому же (исходному) экземпляру списка. Когда вы очищаете локальный массив, вы очищаете и локальный массив, и тот, который, по вашему мнению, вы скопировали в объект (но на самом деле этого не сделали), поскольку это фактически один и тот же массив.

Простой пример:

a = [1, 2, 3]
b = a
a.append(4)
print(b)
# prints [1, 2, 3, 4]

Чтобы назначить / скопировать массив как отдельный объект, вам необходимо использовать операцию копирования или глубокого копирования. Простым способом в вашем текущем коде было бы копирование фрагментов:

objectArray.append(Testclass(exampleArray[:], value))

Обратите внимание на добавление [:].

...