2010-04-21 53 views
4

我想了解Python中的異常行爲。爲什麼這個Python類複製另一個類的內容?

我的下一個Python代碼:

class IntContainer: 

    listOfInts = [] 

    def __init__(self, initListOfInts): 

     for i in initListOfInts: 
      self.listOfInts.append(i) 

    def printInts(self): 

     print self.listOfInts 

if __name__ == "__main__": 

    intsGroup1 = [1,2,3,4] 
    intsGroup2 = [4,5,6,7] 

    intsGroups = [intsGroup1,intsGroup2] 

    intsContainers = [] 

    for ig in intsGroups: 
     newIntContainer = IntContainer(ig) 
     intsContainers.append(newIntContainer) 

    for ic in intsContainers: 
     print ic.listOfInts 

我希望得到的東西,如:

[1, 2, 3, 4] 
[4, 5, 6, 7] 

,但我得到:

[1, 2, 3, 4, 4, 5, 6, 7] 
[1, 2, 3, 4, 4, 5, 6, 7] 

我查了下一個問題:

why is python reusing a class instance inside in function

還有很多Python的參考,但我不明白髮生了什麼。我認爲這與newIntContainer標識符重用相關,但我對此深有體會。

爲什麼Python似乎重新使用新對象的最後一個引用,即使我已將它添加到永久列表中?我能做些什麼來解決這種行爲?

感謝;)

回答

6

既然你做listOfInts一個變量,這就是self.listOfInts被訪問,不管self例如可能;所以,所有的append s都要去相同的列表。

如果這不是你想要的,你需要做的listOfInts例如變量,例如通過在__init__方法的開始分配self.listOfInts = []

+0

非常感謝...... 我在C++來了,PHP和其他地方,你不會有這樣的事情類共享變量(類變量)...我只是認爲我正在定義一個常規的對象參數(實例變量)... – fjfnaranjo 2010-04-21 15:45:25

+3

Actu同盟,C++和PHP都有類(靜態)字段。 – 2010-04-21 15:49:26

2

listOfInts已被定義爲類變量。

類變量由類的所有實例共享。如果你想節省類相關的狀態(當你想知道創建類的實例的數量一個典型的例子是,

如果你想listOfInts成爲每個獨特

這種行爲是非常有用的例如,那麼你應該在初始化或班級爲self.listOfInts的其他方法把它定義

相關問題