根据我的理解,集合中每个对象只能有一个。但我发现以下示例,其中一个集合具有两个相同的对象
class myObject:
def __init__(self, x):
self.x = x
def set(self, x):
self.x = x
def __hash__(self):
return self.x
def __eq__(self, o):
return self.x == o.x
def __str__(self):
return str(self.x)
def __repr__(self):
return str(self.x)
当我运行以下命令时:
x = myObject(1)
mySet = {x}
x.set(2)
mySet.add(x)
print(mySet)
x.set(3)
print(mySet)
我得到以下输出:
{2, 2}
{3, 3}
如果删除__str__
和__repr__
方法,它将显示集合中有两个对象具有相同的内存地址:
{<__main__.myObject object at 0x10e3a10d0>, <__main__.myObject object at 0x10e3a10d0>}
我知道python不允许对列表等内容进行哈希处理,因为哈希码可能会发生变化,从而导致与上面显示的错误类似的错误。为什么python允许这样做,但不允许列表等之类的东西。当然,Python也应该有某种方法来管理变化的哈希。
我已经在Java上测试了相同的示例,发生了相同的事情。为什么这些语言允许这样做?