2015-04-30 2 views
2

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

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

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

А потом вот код дальше:

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

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

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

+2

У вас есть список _объектов_, а не классов. –

+2

Вы спрашиваете, как глубоко скопировать объект или список? –

+0

OK Я поправлю свой вопрос, вам что-нибудь еще добавить, что может помочь мне решить эту проблему?Я, очевидно, новичок. – TheBear

ответ

2

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

Что мы хотим сделать, это использовать метод deepcopy.

from copy import deepcopy 

#snip 
templateclass = deepcopy(ListofClass[position]) 

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

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

1

Используйте 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 также изменяет значение а. Однако добавление к b2 не изменило a.

+0

Это правда в целом, но есть несколько особых случаев, когда 'deepcopy' не будет работать из коробки. –

+0

Я не думаю, что это применимо для этого вопроса. – Riko

0
import copy 
copied_list = copy.deepcopy(list_of_classes) 

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

1

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

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

import copy 

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

Я добавил быстрый ответ, радуясь, что смогу помочь. –

Смежные вопросы