2017-09-03 64 views
1

我已經看到這個問題的多個實例像這樣,但它沒有確定我做錯了什麼,因爲我沒有默認參數。Python對象保持以前的數據?

What am I doing wrong? Python object instantiation keeping data from previous instantiation?

#Table.py 
class Table: 

def __init__(self, players): 
    self.deck = Deck() 

這是主要

t = Table(2) 
print len(t.deck.cards) 

t = Table(2) 
print len(t.deck.cards) 

我希望它可以在每次打印48,而是它打印

48 and then 96 

這是爲什麼?每次都不應該重寫這個成員變量嗎?

#Deck.py 
from Card import * 
import random 

class Deck: 

suits = ['H','C','D','S'] 
numbers = [2,3,4,5,6,7,8,9,10,11,12,13,14] 
cards = [] 

def __init__(self): 
    for num in self.numbers: 
     for suit in self.suits: 
      c = Card(num,suit) 
      self.cards.append(c); 
    random.shuffle(self.cards) 

Card.py

class Card: 

def __init__(self, num, suit): 
    self.num = num 
    self.suit = suit 

def __repr__(self): 
    return str(self.num) + str(self.suit) 

def __str__(self): 
    return str(self.num) + str(self.suit) 
+4

請張貼代碼Deck.py – Penn

+0

我猜你有一個叫'cards'在'Deck'類變量? – PRMoureu

+0

新增@ Penn感謝:) – k9b

回答

3

初始化cards在構造函數中,像這樣:

def __init__(self): 
    self.cards = [] 
    for num in self.numbers: 
     for suit in self.suits: 
      c = Card(num,suit) 
      self.cards.append(c); 
    random.shuffle(self.cards) 

這樣,每次創建該類的新實例時,cards將新鮮初始化。如您希望

你的方法沒有奏效,因爲cards是一類的數據成員,共享Deck類的所有實例中。

+0

@Penn好吧現在似乎還有另一個問題,即每次刷卡時都以相同順序洗牌:)現在就開始工作了https://stackoverflow.com/questions/4794663/python-list-does-not-shuffle -in-一個環 – k9b

-1

您正在使用類變量,而不是實例變量。例如,請參閱python class variables

因此,即使您實例化新實例,也不會獲得靜態類變量的新實例。

西裝,數字,卡片。如果您需要實例變量,請使用「self」,並在init函數中執行。

您每次實例化時都會追加卡片,但是您將它們附加到類變量。因此,你最終的結果是兩倍。

+0

嘿,我看到其他人在我後面可能會有措辭更好的東西或給出的代碼示例,我明白了。但誰低估了我 - 也許你可以告訴我什麼是錯的,所以下次我會做得更好?我想我的答案是正確的 - 我錯過了什麼?謝謝。 – Basya

+0

我沒有downvote,但代碼示例會很好! – Penn

+0

是的,我想是的。但有人毆打我,所以我不認爲我會重複 - 它會或多或少是一樣的。仍然好奇downvote ....要麼我會得到一個答案,並從中學習,否則我會想知道:-)這可能是因爲我很快打「post」並立即編輯它,但我仍然認爲我的初始片段不是不正確的,只是不描述性不夠。 – Basya

2

套裝,數字和卡片是類變量。所以在做self.cards.append(c)時,你需要添加一個類變量,該變量由所有Deck實例的所有實例共享。

將它放到__init__代替:

def __init__(self): 

    self.cards = [] 
    for num in self.numbers: 
     for suit in self.suits: 
      c = Card(num,suit) 
      self.cards.append(c); 
    random.shuffle(self.cards) 
相關問題