2011-04-17 218 views
2

嗨 我創建了一個對象列表。每個對象都包含一個Set。我想更新列表中所有對象的集合內容。我寫來完成這個過程的代碼將元素添加到集合中,將元素添加到包含此集合的對象的所有實例

class Player: 
    name = "" 
    cardsInHand = set() 
    hasBid = False 
    def __init__(self, name): 
     self.name = name 

class CardDeck: 
    deck = [] 

    def __init__(self): 
     for i in range(39) : 
     if i%10>0 and i%10<9 : 
       self.deck.append(i) 

    def dealCards(self,player): 
     cardIndex = 0 
     for tempPlayer in player: 
      for j in range(4): # since want to add four elements at a time 
       tempPlayer.cardsInHand.add(self.deck.pop(cardIndex)) 
       cardIndex = cardIndex +1 

的主要方法,我呼籲上述類別下面的代碼

players = [] 
players.append(Player("Player0")) 
players.append(Player("Player1")) 
players.append(Player("Player2")) 
players.append(Player("Player3")) 

cards.dealCards(players) 

的問題是,dealCards方法添加元素,所有的組的物體。而不是每個對象集合中的4個元素,我最終在每個對象的集合中都有相同的16個元素? 我是新來的python,我做錯了什麼?

回答

3

您正在創建類屬性。

class Player: 
    def __init__(self, name): 
     self.name = name 
     self.cardsInHand = set() 
     self.hasBid = False 
+0

這個工作!。猜猜我必須更多地關注課程屬性。我認爲這與java中類的變量以及構造函數中的變量相同,只需要初始化它們即可。 – nesta13 2011-04-17 14:28:40

+0

糾正我,如果我錯了,類屬性的東西類似於全局變量? – nesta13 2011-04-17 14:29:20

+0

如果課程是全球性的,那麼是的。 – 2011-04-17 14:37:51

3

您已經定義cardsInHand(以及namehasBid)是類變量而不是實例變量;通過在類體中定義它們,您將它們定義爲所有實例共享的變量。如果你熟悉Java,它們基本上就像靜態變量。爲了讓他們的實例變量,需要聲明他們在__init__方法,像這樣:

def __init__(self, name): 
    self.name = name 
    self.hasBid = False 
    self.cardsInHand = set() 
+0

是從早期回覆中得到的想法! – nesta13 2011-04-17 14:31:17