Мой ответ можно рассматривать как дополнение к this post.Функция Python между copy() и deepcopy()
У меня есть словарь, который содержит списки объектов. Мне нужна функция между функциями copy
и deepcopy
в модуле copy
. Я хочу что-то, что выполняет глубокую копию встроенных структур и примитивов Python (целые числа, наборы, строки, списки и т. Д.), Но не создает глубокую копию пользовательских объектов (или не примитивных, неагрегатных объекты).
Возможно, мне понадобится изменить метод моих объектов __deepcopy__
, но я не совсем уверен, как это сделать должным образом. Также предпочтительным является решение, которое не модифицирует метод __deepcopy__
объекта, в том случае, если я хочу сделать глубокую копию объекта в будущем скрипте.
Предположим, что это вершина моего файла Python:
import copy
class Obj():
def __init__(self,i):
self.i = i
pass
d = {0:Obj(5),1:[Obj(6)],2:[]}
d2 = copy.deepcopy(d)
В качестве примера, я перечислю некоторые фрагменты кода ниже, наряду с фактическим выходом и желаемым выходом.
Сниппет 1
d[1][0].i=7
print "d[1][0].i:",d[1][0].i,"d2[1][0].i:",d2[1][0].i
- Фактический выход:
d[1][0].i: 7 d2[1][0].i: 6
- Желаемая Выход
d[1][0].i: 7 d2[1][0].i: 7
Сниппет 2
d[0].i = 6
print "d[0].i:",d[0].i,"d2[0].i:",d2[0].i
- Фактический выход:
d[0].i: 6 d2[0].i: 5
- Желаемая Выход
d[0].i: 6 d2[0].i: 6
Я думаю, вам придется подставить '__deepcopy__' или сделать свой собственный метод – lolopop
вы абсолютно _need_ копии?часто лучший способ решить такую проблему - избегать копирования чего-либо в первую очередь. – Eevee
@Eevee: Проблема в том, что я решаю итеративный вариант, где я просматриваю дерево возможных решений. Я наращиваю решение постепенно (рекурсия для меня слишком медленная). Корневое состояние - это словарь списков, и каждый список содержит объект, который я определил. Мне нужно изменить списки временных словарей, которые я определяю во время итерации, без изменения корня. Мне также нужно хранить ссылки на объекты вместо самих объектов (ради пространства и функциональности). – Matt