无法从另一个对象的列表中删除对象

时间:2016-09-10 22:22:08

标签: python

这是一些描述我的问题的测试代码。我创建了两个类,如下所示......

class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank

class Deck:
    def __init__(self):
        self.cards = []
        for suit in range(4):
            for rank in range(13):
                card = Card(suit, rank)
                self.cards.append(card)

d = Deck()
d.cards.remove(Card(1, 1))

在上一次删除命令之后,我收到以下错误:

Traceback (most recent call last):
  File "<pyshell#111>", line 1, in <module>
    d.cards.remove(Card(1, 1))
ValueError: list.remove(x): x not in list

有谁知道为什么会这样?我可以确认d对象从(0,0)到(3,13)的52个总卡对象初始化。为什么删除模块没有检测到这个?此外,我可以在初始化后执行以下命令,它没有问题。

d.cards.append(Card(1, 1))
d.cards.remove(Card(1, 1))

这会添加然后删除刚刚添加到列表中的卡,但它不会删除使用相同值初始化的卡。

1 个答案:

答案 0 :(得分:5)

您没有定义两个ConnectedThread实例何时相等。如果没有这样的定义,Card找不到任何相同的内容(list.remove()为真)。自定义类的默认实现仅在对象相同时才是相同的(完全相同的对象,obj1 == obj2为真)。

在您的班级中添加__eq__ method,以定义reference1 is reference2个实例的平等含义。

例如,如果CardCard相等且两个rank实例相等,则执行该测试:

suit

现在def __eq__(self, other): if not isinstance(other, Card): return NotImplemented return self.rank == other.rank and self.suit == other.suit 可以找到第一个测试的对象,它等于你传递给该方法的对象。

请注意:

list.remove()
未定义d.cards.append(Card(1, 1)) d.cards.remove(Card(1, 1)) 的情况下,

无法正常工作。该代码创建了两个单独的实例,如果没有自定义__eq__方法,则两个单独的实例永远不会相等。

你最有可能这样做了:

__eq__

因为只有这样才能使对象测试相等;毕竟,它是同一个对象