在类变量和类变量列表中使用关键字“ in”

时间:2018-12-23 23:44:16

标签: python class

我正在尝试制作5张牌的扑克游戏,并且正在尝试制作card_draw的功能,该功能不会产生重复的卡牌,但是在尝试检查是否存在重复功能时遇到了问题随机抽取的卡已被抽取。

from random import choice
class standard_card:

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.card = value + ' of ' + suit

def val():
    values = ['Ace','2','3','4','5','6','7','8',
          '9','10','Jack','Queen','King']
    return choice(values)

def suits():
    suit = ['Spades','Hearts','Clubs','Diamonds']
    return choice(suit)

def card_draw(player_hand,nogo):

    for i in range(5):
        draw = standard_card(val(),suits())
        while draw in nogo:
            draw = standard_card(val(),suits())
        player_hand.append(draw)
        nogo.append(draw)
nogo = []
player_hand = []
card_draw(player_hand,nogo)

所以在def card_draw()中,我只是想确保同一张纸牌不会被抽两次,这就是为什么我有while draw in nogo:

但是,while draw in nogo始终为False,这意味着有时会将重复的卡片放入player_handnogo中。 我不明白为什么draw in nogo总是False。例如,如果我这样做:

test_card = standard_card('7','Spades')

并且通过nogo生成的card_draw()中的一张牌也恰好被赋予了值'7''Spades'

test_card in nogo

始终为False。有人可以解释为什么吗?

2 个答案:

答案 0 :(得分:5)

问题在于您总是在创建一个新对象。默认情况下,两个Python对象只有相同的对象才是相同的。

换句话说,standard_card('2', 'Spades') == standard_card('2', 'Spades')将返回False

为了让Python知道如何比较两张卡片是否相等,您需要通过实现魔术方法__eq__来告诉它如何:

class Card:

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

    def __eq__(self, other):
        return self.value == other.value and self.suit == other.suit

    def __str__(self):
        return self.value + ' of ' + self.suit   

我还实现了__str__方法,因此您可以执行print(card)并根据Python的官方样式指南PEP8对其进行命名。


最后,您可能想要实现一个Deck类,该类包含一副纸牌。然后,您可以从卡组中随机洗牌,并依次弹出卡,以确保每张卡只能被抽出一次。

答案 1 :(得分:1)

因为您每次都将一个新实例与nogo列表中的其他实例进行比较。

您实际上是在这样做:

class A:
    pass

a1 = A()
a2 = A()

print(a1 == a2)

哪个将始终产生False