Python как назначить копию класса переменной? (Вместо ссылки)


У меня есть список, содержащий один и тот же класс, но созданный с разными переменными. Далее по моему коду я в основном пытаюсь получить шаблон одного из классов в этом списке, а затем сбросить некоторые переменные-члены. Однако, когда я изменяю то, что я считаю копией класса, это все еще влияет на исходный класс в списке. Это заставляет меня думать, что я не успешно создал класс, а только ссылку. Как я могу сделать его точную копию, чтобы они не были связаны в любом случае?

Вот основная (и, надеюсь, понятная) схема списка структуры данных класса:

ListofClass = [classA(1,2), classA(34,21), classA(55,32)]

И далее Вот код:

def getClass(position):
    templateclass = ListofClass[position]
    templateclass.var1 = "BLAH"

После этой части кода, мой ListofClass также изменяется, поскольку значение " БЛА " находится в нем. Это не предполагаемый результат!

Большое спасибо.

4   2   2015-04-30 20:02:52

4 ответа:

Выходим из обсуждения быстрого комментария.

То, что мы хотим сделать, - это использовать метод deepcopy.
from copy import deepcopy

#snip
templateclass = deepcopy(ListofClass[position])

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

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

Я понял, что это танкс для Дилана Лоуренса. Я использую модуль копирования, а затем копию.функция deepcopy.

Я изменил свою функцию так, что ее:

import copy

def getClass(position):
    templateclass = copy.deepcopy(ListofClass[position])
    templateclass.var1 = "BLAH"

Используйте deepcopy для копирования, а не для создания ссылки путем назначения.

Решение:

from copy import deepcopy

B = [class_A, class_B, class_C]
A = deepcopy(B)

Пример:

>>> from copy import deepcopy
>>>
>>> a = [1,2,3]
>>> b1 = a
>>> b2 = deepcopy(a)
>>> b1.append(50)
>>> b2.append(51)
>>> a
[1, 2, 3, 50]
>>> b1
[1, 2, 3, 50]
>>> b2
[1, 2, 3, 51]

Обратите внимание, как изменение b1 также изменяет значение на a. добавление к b2, однако, не изменило a.

import copy
copied_list = copy.deepcopy(list_of_classes)

Может быть достаточно?