为什么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个回答
0
投票

这里有指向文档的链接,该文档解决了哈希:https://docs.python.org/3/reference/datamodel.html#object.hash但是更有用的是在修改x之后查看set对象本身。

使用您的:

s = set()
x = myObject(2)

然后查看集合成员的哈希:

enter image description here

然后:

x.set(4)

enter image description here

没有变化。实际上,如果您继续在其他地方使用该设置(例如fs = Frozenset(s)),则将继续传递旧的哈希值。

© www.soinside.com 2019 - 2024. All rights reserved.