我有這樣的代碼:Python - 如何複製對象(所以它不會引用舊對象),而不使用deepcopy?
import pygame
import block as b
import constants as c
import copy
def walls():
walls_list = []
wall_proto = b.Wall(c.WHITE, 40, 40, 20, 80)
wall = copy.copy(wall_proto)
wall.rect_x = 50
print wall_proto.rect_x
print wall.rect_x
walls()
打印:
50
50
但我想打印
40
50
我想在遊戲中創建不同的 '牆'。這些牆可能有很多類似的數據,但也有一些不同。所以我想要有一些可以用來複制的牆對象,然後在不同的牆上設置不同的屬性。如果我使用簡單副本,那麼如果我更改複製對象中的任何內容,則所有其他對象也會更改該值。我可以使用deepcopy,但速度很慢。有沒有比deepcopy更好的解決方案?
更新
按照要求華爾街類:
class Wall(pygame.sprite.Sprite):
def __init__(self, color, x, y, width, height):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
#to get/set values
self._width = width
self._height = height
@property
def rect_x(self):
return self.rect.x
@property
def rect_y(self):
return self.rect.y
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@rect_x.setter
def rect_x(self, value):
self.rect.x = value
@rect_y.setter
def rect_x(self, value):
self.rect.y = value
@width.setter
def width(self, value):
self._width = value
@height.setter
def height(self, value):
self._height = value
你爲什麼不願意使用'deepcopy'? –
因爲它很慢。如果我只依靠深層拷貝,以後它可能會降低性能。所以我希望有一些其他的解決方案,可能會有更好的表現。 – Andrius
您能否顯示Wall的定義,或者更好的創建一個[SSCCE](http://sscce.org/)?明顯的定義不應該導致你所看到的行爲。 – delnan