2015-10-09 20 views
0

好吧,所以如果你有一個類實例分配給'Bill',我明白你不能只用'karl = bill'來使'karl'成爲一個獨立的實例,其參數與bill相同。對於以下類:一種自動化類變量複製的方法?

class person(): 
    def __init__(self,x=5,y=1,z=0): 
     self.x = x 
     self.y = y 
     self.z= z 



bill = person() 

顯然卡爾=法案,只是讓「卡爾」指針「法案」,所以「卡爾」所做的任何更改實際的變化法案提出。只有3個變量,通過karl = person(bill.x,bill.y,bill.z) 的方法複製karl並不重要。然而,當您添加類變量/參數時,這會變得越來越單調乏味。 haircolor,hairlenth,眼睛的顏色,等等。例如,組成一個人的所有屬性。

有沒有辦法簡化/自動克隆一個類的實例? python沒有保留一個類的參數的迭代列表,所以你可以做一些像 「在bill._args中的n:」或者什麼?

或者這不是開發具有大量變量的類的最佳方式嗎?

+5

你有沒有聽說過[複製](https://docs.python.org/2 /library/copy.html#copy.copy)和[deepcopy](https://docs.python.org/2/library/copy.html#copy.deepcopy)? – alfasin

+0

要查看對象的內容,請嘗試使用'bill .__ dict__'如果對象具有您不想共享的列表或字典,請使用'deepcopy'而不是'copy'。 – Alexander

+0

不過要注意, 「copy.copy」和「copy.deepcopy」都不是複製對象的正確方法,如果某些東西應該被共享,有些不應該被複制,或者複製只需要深入到具體深度。例如,如果你想複製一個樹狀迭代器來跟蹤它的位置和一堆節點,你會想複製堆棧,但不是節點。 'copy.copy(迭代器)'和'copy.deepcopy(迭代器)'都不會這樣做。這可以通過定製'copy'和'deepcopy'如何處理你的對象來處理。 – user2357112

回答

1

使用副本:

In [1]: class person(): 
    ...:   def __init__(self,x=5,y=1,z=0): 
    ...:     self.x = x 
    ...:     self.y = y 
    ...:     self.z= z 
    ...: 

In [2]: p = person() 

In [3]: import copy 
In [5]: copy_of_p = copy.copy(p) 

In [6]: id(copy_of_p) 
Out[6]: 4524984368 

In [7]: id(p) 
Out[7]: 4525007432 

In [8]: copy_of_p.x = 50 

In [9]: p.x 
Out[9]: 5 
1

參考類person在代碼上面:

import copy 
bill = person() 
billsShallowClone = copy.copy(bill) 
相關問題