- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 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/
我有一个类,我想为这个类写一个__hash__()方法。我要编写的方法在某些情况下会返回对象的默认散列,而在其他一些情况下会返回其属性之一的散列。所以,作为一个简单的测试用例: class Foo:
我有一个类(class)叫 Transaction ,其中包含多个属性。如果这些属性中的任何一个匹配,那么我希望将这些事务视为重复事务,因此不想在集合中存储重复项。 class Transaction
假设我写了一个类,但没有为它定义一个__hash__。然后__hash__(self)默认为id(self)(self的内存地址),根据the documentation . 但是我没有在文档中看到这
我正在尝试为字符串创建自定义哈希函数。我想按权重按字符频率对字符串进行哈希处理。这样 hi 和 ih 将产生相同的散列。我可以覆盖 __hash__ 吗? 或者创建一个包含字符串并覆盖 __hash_
假设我有一些 Person 实体,我想知道其中一个是否在列表中: person in people? 我不关心“对象的 ID”是什么,只关心它们的属性是否相同。所以我把它放在我的基类中: # valu
在 Python 文档中,我们可以阅读有关 __hash__ 函数的内容: The only required property is that objects which compare equal
我在正确散列我的对象时遇到了问题。考虑以下代码: class Foo: def __init__(self, bar): self.keys = list(bar.keys()
有没有办法给js自定义哈希中的对象,就像重写一样 __hash__() 在 python 中,让我们定义如何将给定对象散列到字典中。 我的基本问题是:使用什么哈希函数将 js 对象放入关联数组中,我可
我刚刚在 Python3 中观察到 Set 的一个有趣行为,我想知道为什么。 给定类: class Tab: @staticmethod def set(size):
给定: class T: def __hash__(self): return 1234 t1 = T() t2 = T() my_set = { t1 } 我希望以下内容打印
编辑:正如@BrenBarn 指出的那样,原文没有意义。 给定一个字典列表(由 csv.DictReader 提供——它们都有 str 键和值)最好通过全部填充来删除重复项在一个集合中,但这不能直接完
我所做的显然不是人们想要做的事情,相反,我只是在测试为给定类实现 __hash__。 我想看看是否向字典添加一个虚假的“可散列”类,然后更改它的散列值会导致它无法访问它。 我的类(class)是这样的
这个问题在这里已经有了答案: add object into python's set collection and determine by object's attribute (1 个回答)
实现__hash__()的正确好方法是什么? 我说的是返回哈希码的函数,该哈希码随后用于将对象插入哈希表(也称为字典)中。 由于 __hash__() 返回一个整数并用于将对象“分箱”到哈希表中,我假
在 Python 中,我知道 __hash__ 为给定对象返回的值在该对象的生命周期内应该是相同的。但是,出于好奇,如果不是,会发生什么?这会造成什么样的破坏? class BadIdea(objec
我有一个名为 WeakBoundMethod 的类(codereview.se 上的 source)。我想要一些关于我应该如何实现的指南 __hash__() .此外,Python 3 自动提供了 _
我希望这可行(在 Python 3.6 中), class A: __hash__ = id A().__hash__() 但我明白了 TypeError: id() takes exactl
以下将起作用,但我宁愿不需要重复 __hash__在每个子类中。有没有办法告诉数据类继承哈希函数(即不将其设置为 None )? from dataclasses import dataclass @
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在尝试理解我目前正在处理的一段代码(它的 pacman)。 我在 Python 中有以下二维数组: self.data = [[initialValue for y in range(height
我是一名优秀的程序员,十分优秀!