Найти - Пользователи
Полная версия: Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.
Начало » Python для новичков » Как сделать копию объекта ? copy.copy(x) - не дает нужного эффекта.
1
Luke
Есть класс с атрибутами - массивами 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
Необходимо чтобы изменения в копии никак не изменяли оригинал, и копию можно было бы передавать в другие классы которые вызывают методы копии (читают - изменяют атрибуты).
paraman
>>> 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]])
krishnarama
А чем Numpy не устраивает deepcopy?
Luke
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
krishnarama
Не за что, лол
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB