将自定义对象添加到集合中时,Python的集合行为

时间:2018-10-29 08:37:37

标签: python class hash set

我有一些让我感到困惑的代码。我已经阅读了有关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()行为正常工作(不添加重复元素)。

0 个答案:

没有答案