gpt4 book ai didi

python - 覆盖 __hash__ 后哈希值相同但对象不同

转载 作者:行者123 更新时间:2023-11-28 20:28:32 28 4
gpt4 key购买 nike

我在正确散列我的对象时遇到了问题。考虑以下代码:

class Foo:
def __init__(self, bar):
self.keys = list(bar.keys())
self.values = list(bar.values())
def __str__(self):
return ', '.join( '%s: %s' % z for z in zip(self.keys, self.values))
def __hash__(self):
return hash(str(self))

if __name__ == '__main__':
result = set()
d = { 1: 2, 3: 4, 5: 6, 7: 8 }
for i in range(10):
result.add(Foo(d))
for r in result:
print r, hash(r)

我希望结果集包含单个元素,因为所有添加的 Foo 对象都具有相同的内容,因此具有相同的散列。

然而,这是结果:

misha@misha-K42Jr:~/Desktop/stackoverflow$ python hashproblem.py 
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338
1: 2, 3: 4, 5: 6, 7: 8 2131119371379196338

这里有什么问题?散列确实看起来一样,所以它们不应该被内置的set 对象视为重复项吗?为什么该集合包含重复项?

我注意到如果我在向集合中添加元素时使用 str(Foo(d)) 而不是 Foo(d) ,事情会按预期进行。为什么重要?

Python 版本是:

misha@misha-K42Jr:~/Desktop/stackoverflow$ python --version
Python 2.6.6

最佳答案

由于__hash__ 方法只用于内部哈希表,因此您还需要重新定义__eq__

仅覆盖 __eq__ 也不正确。如果两个对象相等,即 a.__eq__(b) == True,则 hash(a)hash(b)也必须相等。

默认的__hash__方法是:

def __hash__(self):
return id(self)

关于python - 覆盖 __hash__ 后哈希值相同但对象不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com