将列表索引传递给用户定义的函数python

时间:2017-11-20 00:03:05

标签: python-2.7 function class object methods

我正在学习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列表中的第一个牌?为什么将它附加到列表中的每个实例,如何阻止这种情况发生?

我一直在观察它并尝试使用不同的打印方式,以确保它不仅仅是因为我打印错误。我无法理解出了什么问题!

对不起,这是一个很长的问题,我只想尽可能多地提供信息。这可能是非常简单的事情,我只是无法看到它,因为我只是在学习。任何帮助将不胜感激!

1 个答案:

答案 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