为什么Set允许同一对象的多个对象具有更改的hashCode?

问题描述 投票:1回答:1

根据我的理解,集合中每个对象只能有一个。但我发现以下示例,其中一个集合具有两个相同的对象

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上测试了相同的示例,发生了相同的事情。为什么这些语言允许这样做?

python python-3.x set hashcode
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.