Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2013 20:46:28

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.

Есть класс с атрибутами - массивами 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)

Офлайн

#2 Фев. 27, 2013 21:15:23

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.

>>> 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]])

Офлайн

#3 Фев. 27, 2013 21:24:14

krishnarama
Зарегистрирован: 2013-02-27
Сообщения: 51
Репутация: +  -36  -
Профиль   Отправить e-mail  

Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.

А чем Numpy не устраивает deepcopy?

Офлайн

#4 Фев. 27, 2013 23:23:57

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.

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')
Проблема в объекте user, это из-за него в моем скрипте не работает deepcopy() модели так как одно из свойств - ссылка на user. А в User у меня полная лапша с GUI



Офлайн

#5 Фев. 28, 2013 00:01:08

krishnarama
Зарегистрирован: 2013-02-27
Сообщения: 51
Репутация: +  -36  -
Профиль   Отправить e-mail  

Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.

Не за что, лол

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version