Форум сайта python.su
3
Есть класс с атрибутами - массивами numpy, и методами их изменяющими. Создаю экземпляр этого класса, потом нужно сделать копию этого объекта, передать в другой класс.
Если сделать x_copy=copy.copy(x) то изменения в массивах копии происходят и в оригинале.
Если сделать x_copy=copy.deepcopy(x) выдает ошибку “TypeError: object.__new__(PyCMenu) is not safe, use PyCMenu.__new__()” в модуле lib\copy_reg.py line 100
Необходимо чтобы изменения в копии никак не изменяли оригинал, и копию можно было бы передавать в другие классы которые вызывают методы копии (читают - изменяют атрибуты).
Отредактировано Luke (Фев. 27, 2013 20:53:07)
Офлайн
1
>>> from numpy import * >>> a = arange(10).reshape(2,5) >>> b = a.copy() >>> a array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> b array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> a[0][0] = 1000 >>> a array([[1000, 1, 2, 3, 4], [ 5, 6, 7, 8, 9]]) >>> b array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> b[0][3] = 2000 >>> a array([[1000, 1, 2, 3, 4], [ 5, 6, 7, 8, 9]]) >>> b array([[ 0, 1, 2, 2000, 4], [ 5, 6, 7, 8, 9]])
Офлайн
-36
А чем Numpy не устраивает deepcopy?
Офлайн
3
paraman
Не то.
krishnarama
Отправили в нужном направлении. Пока писал пример сюда, понял что Numpy не причем.
# -*- coding: utf_8 -*- import copy import numpy as np class Model: def __init__(self,col,user): self.user=user self.arr=np.zeros((col),dtype=int) def run(self): model_copy=copy.copy(self) #так работает неправильно # model_copy=copy.deepcopy(self) #так работает как надо в этом примере, но с другим классом User не работает i=self.user.get(model_copy) if self.arr[i]==0: self.set(i,1) else: print u"так нельзя" def set(self,i,z): self.arr[i]=z class User: def get(self,model_copy): pot=np.argwhere(model_copy.arr==0) ret=pot[np.random.randint(pot.shape[0])] for i in enumerate(model_copy.arr): # вот это не должно влиять на оригинал model_copy.arr[i[0]]=1 return ret def _test(): user=User() model_orig=Model(5,user) model_orig.arr[1]=-1 model_orig.run() print model_orig.arr # Должно напечатать одну 1, одну -1, и три 0 if __name__ == '__main__': _test() raw_input(u'Press Enter to exit')
Офлайн
-36
Не за что, лол 
Офлайн