gpt4 book ai didi

python - 如果对象的 __hash__ 发生变化会发生什么?

转载 作者:IT老高 更新时间:2023-10-28 20:22:31 25 4
gpt4 key购买 nike

在 Python 中,我知道 __hash__ 为给定对象返回的值在该对象的生命周期内应该是相同的。但是,出于好奇,如果不是,会发生什么?这会造成什么样的破坏?

class BadIdea(object):
def __hash__(self):
return random.randint(0, 10000)

我知道 __contains____getitem__ 会表现得很奇怪,因此 dicts 和 set 会表现得很奇怪。您也可能会在 dict/set 中得到“孤立”值。

还会发生什么?它会导致解释器崩溃,还是破坏内部结构?

最佳答案

您的主要问题确实是字典和集合。如果您将一个对象插入到 dict/set 中,并且该对象的哈希值发生了变化,那么当您尝试检索该对象时,您最终将在 dict/set 的底层数组中查找 不同 点,因此找不到对象。这正是 dict 键应该始终不可变的原因。

这是一个小例子:假设我们将 o 放入一个 dict 中,而 o 的初始哈希是 3。我们会做这样的事情(稍微简化一下但明白了):

Hash table:  0   1   2   3   4   5   6   7+---+---+---+---+---+---+---+---+|   |   |   | o |   |   |   |   |+---+---+---+---+---+---+---+---+              ^              we put o here, since it hashed to 3

现在让我们假设 o 的哈希更改为 6。如果我们想从字典中检索 o,我们将查看位置 6,但那里什么都没有!这将在查询数据结构时导致误报。实际上,在 dict 的情况下,上面数组的每个元素都可能有一个与之关联的“值”,并且单个位置可能有多个元素(例如 hash collision )。此外,在决定将元素放置在何处时,我们通常会取散列值以数组大小为模。然而,不管所有这些细节,上面的例子仍然准确地传达了当对象的哈希码发生变化时可能出现的问题。

Could it crash the interpreter, or corrupt internal structures?

不,这不会发生。当我们说一个对象的散列变化是“危险的”时,我们的意思是危险的,因为它本质上违背了散列的目的,并且即使不是不可能推理也使代码变得困难。我们并不是说危险,因为它可能导致崩溃。

关于python - 如果对象的 __hash__ 发生变化会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161035/

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