2012-06-26 83 views
3

以下代碼是我遇到的問題,正在尋找解釋。代碼的行爲與我預期的不同。下面的代碼將是我的預期輸出和實際輸出。最後要注意的是,我知道這個代碼可能是'奇怪的',使用範圍(1)有點奇怪,至少可以說。原因是程序中的這種確切發生(範圍是變量,但是在這些值)引起了問題..所以我讓這個簡單的代碼來複制它。列表與追加的Python奇怪行爲

userList = [] 

class User(): 
    listA = [] 
    listB = [] 

    def setup(self): 
     for i in range(1): 
      self.listA.append('a') 
      self.listB.append('b') 

for i in range(5): 
    user = User() 
    userList.append(user) 

for i in range(len(userList)): 
    userList[i].setup() 

for i in range(len(userList)): 
    print str(userList[i].listA) 
    print str(userList[i].listB) 

期望輸出

['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 

實際輸出

['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 

討論

我apprecia對這種情況發生的原因作出任何解釋。我不確定內置的append()函數是以何種方式影響所有用戶,或者如果每個用戶以某種方式共享他們的字段。在Python 2.7.3上運行。

+2

'listA'是一類不是一個實例變量 – Voo

+0

儘管是壓痕內爲類User()? – user650658

+1

是的,儘管它被縮進到一個類變量的水平 –

回答

8

比較這對你的代碼

class User(): 
    def setup(self): 
     self.listA = []       # instance variable 
     self.listB = []       # instance variable 
     for i in range(1): 
      self.listA.append('a') 
      self.listB.append('b') 

需要注意的是,沒有必要在類級別,以「聲明」的任何變量

+0

確實如此,但我試圖弄清楚如何做到這一點。我感謝您的幫助!另一個StackOverflow問題也有助於討論類的__init__方法來聲明類級變量。 – user650658