2017-09-03 57 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) 
相关问题