使用关键字"in"与类变量和类变量列表

agn*_*gni 3 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)
Run Code Online (Sandbox Code Playgroud)

因此,def card_draw()我只是想确保同一张卡片没有画两次,这就是我的原因while draw in nogo:.

然而,while draw in nogo总是False,这意味着有时重复的卡片投入player_handnogo.我不明白为什么draw in nogo总是这样False.例如,如果我这样做:

test_card = standard_card('7','Spades')
Run Code Online (Sandbox Code Playgroud)

和在卡中的一个nogo通过产生card_draw()也恰好是给定的值'7''Spades',

test_card in nogo
Run Code Online (Sandbox Code Playgroud)

永远False.有人可以解释为什么好吗?

Gra*_*her 6

问题是你总是在创建一个新对象.默认情况下,如果两个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   
Run Code Online (Sandbox Code Playgroud)

我也实现了这个__str__方法,所以你可以print(card)根据Python的官方样式指南PEP8进行命名.


最后,你可能想要实现一个Deck持有一副牌的类.然后你可以洗牌并连续从牌组中弹出牌,保证每张牌只能画一次.