1

我有这三个 Python 类:

class Card(object):
    RANKS = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
    SUITS = ["c", "d", "h", "s"]
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __str__(self):
        return self.rank + self.suit

    def __lt__(self, other):
        return self.value < other.value

    def __gt__(self, other):
        return self.value > other.value

    @property
    def value(self):
        return RANKS.index(self.rank) + SUITS.index(self.suit)/4


class Hand(object):
    def __init__(self, cards = []):
        self.cards = cards
        self.tricks = 0

    def __str__(self):
        return " ".join([str(card) for card in self.cards])

    def add(self, card):
        self.cards.append(card)

    def remove(self, card):
        self.cards.remove(card)


class Deck(Hand):
    def populate(self):
        for rank in Card.RANKS:
            for suit in Card.SUITS:
                self.add(Card(rank, suit))

但是当我运行这段代码时:

deck1 = Deck()
deck1.populate()
hand1 = Hand()
print(hand1)

打印一整副卡片。该类Hand似乎正在运行populate(self)。为什么?

4

1 回答 1

1

你的问题在这里:

def __init__(self, cards = []):
        self.cards = cards
        self.tricks = 0

您会看到,在 Python 的函数定义def __init__(self, cards=[]):中,默认参数仅在解释器加载函数定义时被评估一次,因此它们的行为有点像全局性的。另请注意,列表是一个可变对象,因此,根据定义,它可以更改其元素。结果,当您调用 时self.cards.append(card),它会附加到这个曾经评估过的、每次相同的列表中。解决方案是:

def __init__(self, cards=None):
    if cards is None:
         cards = []
    self.cards = cards
    self.tricks = 0
于 2013-10-05T14:00:11.083 回答