![](/img/trans.png)
[英]Python - copy.deepcopy() doesn't work on copying local scope into global scope variable
[英]How to completely copy a class instance in Python? copy.deepcopy doesn't work
假設我有一個簡單的 python 類,例如
class A():
def __init__(self, b):
self.b = pygame.image.load(b)
我想做一個函數來復制這個類中的所有內容。 我面臨的問題是,當我使用copy.deepcopy(<class instance>)
時,由於參數是pygame.Surface
對象,因此無法使用該函數進行復制。 如何創建一個創建新類實例並將指向它的指針存儲在新變量中的函數?
編輯:最好有一個簡單的屬性,例如
class A():
def __init__(self, b):
self.b = pygame.image.load(b)
@property
def clone(self):
<code to copy>
首先,我想指出這並非巧合。 您通常不想復制圖像,因為它會占用大量內存。
如果你還想那么:
class A:
def __init__(self, b):
self.b = pygame.image.load(b)
# @property is not good here. Keep it as a method
def copy(self):
c = copy.deepcopy()
# pygame.Surface.copy method
c.b = self.b.copy()
return c
您不能pygame.Surface
deepcopy
,但是pygame.Surface
有一個copy
方法。 請參閱復制精靈。
您的代碼的問題是您在對象構造函數中加載了Surface
。 這是不好的做法,會導致您的問題。 在初始化時加載圖像並將圖像傳遞給對象構造函數。 如果要在類中封裝文件的加載,請使用@staticmethod
:
class A():
@staticmethod
def new():
image = pygame.image.load('my_image_file.png')
return A(image)
def __init__(self, image):
self.image = image
def clone(self):
return A(self.image.copy())
a = A.new()
copy_of_a = a.clone()
無論如何,絕對不需要復制pygame.Surface
。 通常, surface
是靜態的,根本不會改變。 它只存儲對象的圖形表示,不存儲其他信息。 如此多的對象可以共享同一個Surface
對象。 不必復制Surface
,只需分享即可,這樣可以節省大量內存並提高性能:
class A():
def __init__(self, image):
self.image = image
def clone(self):
return A(self.image)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.