我正在学习Python并尝试编写一个模拟卡片游戏,但我遇到了一个问题而且我不知道自己做错了什么。
我已经定义了3个类:Card,Hand和Deck如下:
卡:
class Card(object):
def __init__(self, suit, pip):
self.suit = suit
self.pip = pip
def __str__(self):
return self.suit + self.pip
def get_suit(self):
return self.suit
def get_pip(self):
return self.pip
手:
class Hand(object):
def __init__(self, cards = []):
self.cards = cards
def __str__(self):
hand_cards = ''
for card in self.cards:
hand_cards += ' ' + card.__str__() +','
return 'Your hand is:' + hand_cards
def draw(self, card):
self.cards.append(card)
甲板:
class Deck(object):
def __init__(self):
self.deck = []
for suit in suits:
for pip in pips:
self.deck.append(Card(suit,pip))
self.deck = self.deck*numdecks
def shuffle(self):
random.shuffle(self.deck)
def deal(self):
return self.deck.pop()
然后我有一个名为player_hands
的列表,它存储了一个Hand对象列表(numplayers
是一个来自早期输入的变量):
player_hands = []
for x in range(numplayers):
player_hands.append(Hand())
最后我有一个名为dealcard
的函数,我想用它将一个Card对象从Deck传递给Hand(Deck和Hand作为参数传递):
def dealcard(deck, hand):
hand.draw(deck.deal())
这就是我遇到问题的地方。当我执行下面的代码时,函数似乎一次将相同的Card附加到Hand类的每个实例:
d = Deck()
dealcard(d,player_hands[0])
例如,如果有3手,我就运行它:
for h in player_hands:
print h
我明白了:
你的手是:D6,
你的手是:D6,
你的手是:D6,
其中D是套装,6是我试图附加到player_hands[0]
的卡的点数 - 我认为这是player_hands
列表中的第一个牌?为什么将它附加到列表中的每个实例,如何阻止这种情况发生?
我一直在观察它并尝试使用不同的打印方式,以确保它不仅仅是因为我打印错误。我无法理解出了什么问题!
对不起,这是一个很长的问题,我只想尽可能多地提供信息。这可能是非常简单的事情,我只是无法看到它,因为我只是在学习。任何帮助将不胜感激!
答案 0 :(得分:0)
将列表传递给Hand类中的构造函数时出现问题。 您应该使用cards = None而不是cards = [],如下所示。
class Hand(object):
def __init__(self, cards = None):
if cards is None:
cards = []
self.cards = cards
def __str__(self):
hand_cards = ''
for card in self.cards:
hand_cards += ' ' + card.__str__() +','
return 'Your hand is:' + hand_cards
def draw(self, card):
self.cards.append(card)
您可以阅读以下链接以获取更多信息 Passing a list to class python