我有一组Point对象,并且我希望能够从我的集合中删除这些对象。但是,Python似乎是按指针而不是按值对它们进行比较,因此我无法轻松删除元素,因为它们没有相同的指针,因为它们不是完全相同的对象。这仅是对象的问题,而不是基元的问题。
我的问题的简化示例:
class Point():
def __init__(self, x, y):
self.x = x
self.y = y
a = set()
a.add(Point(0, 0))
b = Point(0, 0)
a.remove(b)
运行时,返回
Traceback (most recent call last):
File "example.py", line 9, in <module>
a.remove(b)
KeyError: <__main__.Point object at 0x7f6292376128>
(显然,每次运行时特定的指针都会改变)。
我希望将元素(0, 0)
从a
中删除,而将a
保留为空集。
答案 0 :(得分:3)
如果您告诉Python如何比较这些对象,则可以使用。添加两个方法,例如:
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __hash__(self):
return hash((self.x, self.y))
class Point():
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __hash__(self):
return hash((self.x, self.y))
a = set()
a.add(Point(0, 0))
b = Point(0, 0)
a.remove(b)
答案 1 :(得分:0)
似乎没有将b点实际上添加到集合'a'中。 根据文档:
如果传递给remove()方法的元素(参数)不存在,则会引发keyError异常。
我做了些微改动,但没有出错
class Point():
def __init__(self, x, y):
self.x = x
self.y = y
a = set()
a.add(Point(0, 0))
b = Point(0, 0)
a.add(b)
a.remove(b)