Python, как скопировать объект эффективным способом, который также позволяет его модифицировать?

В моем коде Python у меня есть следующая проблема: мне приходится копировать один и тот же объект много раз, а затем передавать каждую копию функции, которая его модифицирует. Я попытался с copy.deepcopy, но это действительно вычислительно дорого, затем я попытался с itertools.repeat(), но это была плохая идея, потому что после этого я должен изменить объект. Поэтому я написал простой метод, который копирует объект, просто возвращая новый объект с такими же атрибутами:

def myCopy(myObj):
    return MyClass(myObj.x, myObj.y)

Проблема в том, что это тоже неэффективно: мне нужно сделать это около 6000 раз, и это займет более 10 секунд! Итак, существует ли лучший способ сделать это?

Объектом для копирования и изменения является таблица, которая создается следующим образом:

def initialState(self):
    table = []
    [table.append(Events()) for _ in xrange(self.numSlots)] 
    for ei in xrange(self.numEvents - 1):
        ei += 1
        enr = self.exams[ei]
        k = random.randint(0, self.numSlots - 1)
        table[k].Insert(ei, enr)
    x = EtState(table)
    return x

class Event:

    def __init__(self, i, enrollment, contribution = None):
        self.ei = i
        self.enrollment = enrollment
        self.contribution = contribution



class Events:

    def __init__(self):
        self.count = 0
        self.EventList = []

    def getEvent(self, i):
        return self.EventList[i].ei


    def getEnrollment(self, i):
        return self.EventList[i].enrollment

    def Insert(self, ei, enroll = 1, contribution = None):
        self.EventList.append(Event(ei, enroll, contribution))
        self.count += 1

    def eventIn(self, ei):
        for x in xrange(self.count):
            if(self.EventList[x].ei == ei):
                self.EventList[x].enrollment += 1
                return True
        return False

1 ответ

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

Поскольку объект в Python означает что угодно, класс, экземпляр, dict, список, кортеж, "а" и т. Д.

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

Поэтому напишите функцию, которая принимает один экземпляр этого класса, в этой функции создайте другой экземпляр и скопируйте все необходимые вам атрибуты.

Другие вопросы по тегам