2013-01-22 63 views
1

可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument
dictionary shared between objects for no reason?Python對象列表,每個對象都有自己的數組字典。附加到一個附加到所有

 class Player(): 
     zones = {} 
     def __init__(self): 
      self.zones['hand'] = [] 
     def InitHand(self): 
      for a in range(5): 
       self.zones['hand'].append(a) 
lst = [] 
lst.append(Player()) 
lst.append(Player()) 
lst[0].InitHand() 
print lst[1].zones['hand'] 

此打印 「[0,1,2,3,4]」,但我只初始化了第0個元素... 將它們更改爲數組可以解決問題,但對於我的生活,我無法弄清楚爲什麼會發生這種情況。

class Player2(): 
     zones = [] 
     def __init__(self): 
      self.zones = [] 
     def InitHand(self): 
      for a in range(5): 
       self.zones.append(a) 
lst = [] 
lst.append(Player2()) 
lst.append(Player2()) 
lst[0].InitHand() 
print lst[1].zones 

這打印 「[]」 預期

+0

相關/欺騙:Python中「最小驚訝」:易變的默認參數(http://stackoverflow.com/q/1132941) –

+0

@MartijnPieters我看不出在這個任何可變默認參數題。 –

+3

@MarkRansom:這就是我說'相關'的原因。原理相同,在這種情況下,mutable屬性在實例之間共享,而不是函數調用。 –

回答

3

在代碼中,所有玩家共享相同的zones字典。任何在類範圍中設置的屬性都是屬性,而不是實例屬性。

class Player(): 
    def __init__(self): 
     self.zones = {} 
     self.zones['hand'] = [] 
    def InitHand(self): 
     for a in range(5): 
      self.zones['hand'].append(a) 
+1

+1,但我會將其更改爲「類範圍中設置的任何內容都是類屬性」,因爲可以在實例可能存在的任何上下文(包括類或靜態方法)中設置實例屬性。 –

相關問題