我有一些让我感到困惑的代码。我已经阅读了有关Python的set()add()函数的文档,但不明白为什么会发生以下情况:
class Node:
number = None
example_set = set()
def __init__(self, num):
self.number = num
def __hash__(self):
return hash(self.number)
def __eq__(self, other):
return self.number == other.number
def __ne__(self, other):
return not self.__eq__(other)
node1 = Node(1)
node2 = Node(2)
node1.example_set.add(node2)
print('first add')
for node in node1.example_set:
print('node1 set: ' + str(node.number))
for node in node2.example_set:
print('node2 set: ' + str(node.number))
node2.example_set.add(node1)
print('second add')
for node in node1.example_set:
print('node1 set: ' + str(node.number))
for node in node2.example_set:
print('node2 set: ' + str(node.number))
node1.example_set.add(node2)
print('third add')
for node in node1.example_set:
print('node1 set: ' + str(node.number))
for node in node2.example_set:
print('node2 set: ' + str(node.number))
输出:
first add
node1 set: 2
node2 set: 2
second add
node1 set: 1
node1 set: 2
node2 set: 1
node2 set: 2
third add
node1 set: 1
node1 set: 2
node2 set: 1
node2 set: 2
我不明白为什么现在每个集合都有两个元素。我显式地为每个集合添加了一个元素。在仅向第一个集合中添加一个元素之后,添加的对象也被添加到该对象的 own 集合中。
我添加了__hash__,__eq__和__ne__替代,因为我认为该集合可能会错误地处理我的对象。无论如何,如果我删除这些替代,则输出是相同的。任何帮助表示赞赏。我还添加了“第三个添加”,以显示集合的add()行为正常工作(不添加重复元素)。