2015-06-12 85 views
1

我是Python的新手,擁有更多的Java背景。我理解Python中的靜態類變量的概念,但是我注意到列表和對象不像字符串那樣工作,例如 - 它們在類的實例之間共享。Python中的靜態類變量 - 列表和對象

換句話說:

class box(): 

    name = '' 
    contents = [] 

    def __init__ (self, name): 
     self.name = name 

    def store (self, junk): 
     self.contents.append(junk) 

    def open (self): 
     return self.contents 

現在,如果我創建兩個實例,並嘗試添加東西對他們說:

a = box('Box A') 
b = box('Box B') 

a.store('apple') 
b.store('berry') 

print a.open() 
print b.open() 

輸出:

['apple','berry'] 
['apple','berry'] 

這是非常清楚的,他們」在框的兩個實例之間重新共享。

def store (self, junk): 
    temp = self.contents 
    temp.append(junk) 
    self.contents = temp 

但有一個更清潔/更傳統的方式:

現在我可以通過以下操作得到解決呢?有人能解釋爲什麼發生這種情況嗎

+1

你可能會發現[實例變量vs類變量](http://stackoverflow.com/questions/2714573/instance-variables-vs-class-variables-in-python)有用。 – kalhartt

回答

1

的關鍵詞self讓他們獨立,如果你都這麼說,self.name,屬於box()類的當前實例:

class box(): 

    def __init__ (self, name): 
     self.name = name 
     self.contents = [] 

    def store (self, junk): 
     self.contents.append(junk) 

    def open (self): 
     return self.contents 
+0

非常好!我想我不像我想的那樣理解這些概念。 謝謝! – user1569175

+0

最受歡迎... :) –

0

這兩個變量都是你的情況下的類變量。但是,您爲對象A和B設置了不同的字符串,實際上您正在重新初始化它們。另一方面,列表不會再次初始化,因此對象A和B的列表都指向內存中的同一個對象。追加項目因此將項目追加到內存中的同一列表。因此,結果。

你要這樣寫:

class box(): 


    def __init__ (self, name): 
     self.name = name 
     self.contents = [] 

    def store (self, junk): 
     self.contents.append(junk) 

    def open (self): 
     return self.contents