我有一个类“Plan”,它有一个属性“edges”,这是一个集合。你知道吗
例如:
Plan.edges
Out:
{Edge literal-b851-True-bel --0--> strut-23-b495,
Edge strut-23-b495 --effect-of--> literal-8b06-True-at,
Edge cam-step-shot-24-8734 --effect-of--> literal-b851-True-bel,
Edge strut-23-b495 --effect-of--> literal-8b06-True-at}
每个边都有一个源节点、一个字符串标签和一个汇节点。 我看了一个复制品,感到很困惑,就让
edges = list(Plan.edges)
Out:
[Edge literal-b851-True-bel --0--> strut-23-b495,
Edge strut-23-b495 --effect-of--> literal-8b06-True-at,
Edge cam-step-shot-24-8734 --effect-of--> literal-b851-True-bel,
Edge strut-23-b495 --effect-of--> literal-8b06-True-at]
并询问
edges[1] == edges[3]
Out:
True
我的理解是,==操作符是复制的标准(我已经使用uueq\uuuhook定制了这个标准)。我已经通过==操作符检查了源节点和汇节点是否相等。我还检查了从集合中弹出它们,==操作符仍然发现边是相等的。一个简单的修复是Plan.edges = set(list(Plan.edges))
(这提供了期望的结果)但是我计划运行这个程序超过一百万次,所以我不希望添加不必要的代码,特别是当我不了解问题的根本原因时。你知道吗
Edge.__eq__(e2, e4)
Edge.__eq__(e4, e2)
e2.__eq__(e4)
e4.__eq__(e2)
e2 == e4
e4 == e2
一切都是真的。你知道吗
我的问题是,这怎么可能,我能做些什么来防止这种情况?我正在运行python3.3.2。事先谢谢你的帮助。你知道吗
。。。类内边缘
class Edge:
__slots__ = 'source', 'sink', 'label'
def __init__(self, source, sink, label):
self.source= source
self.sink = sink
self.label = label
def __eq__(self, other):
if other is None:
return False
if self.source.ID == other.source.ID and self.sink.ID == other.sink.ID and self.label == other.label:
return True
return False
def __ne__(self, other):
return (not self.__eq__(other))
def __hash__(self):
return hash(self.source.ID) ^ hash(self.sink.ID) ^ hash(self.label)
目前没有回答
相关问题 更多 >
编程相关推荐