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

2023-12-26

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

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

I know __contains__ and __getitem__会表现得很奇怪,因此听写和集合也会表现得很奇怪。您还可能最终在字典/集中得到“孤立”值。

还会发生什么?它会使解释器崩溃,或者破坏内部结构吗?


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

这是一个小例子:假设我们把o放入字典中,并且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,但是那里什么也没有!这会在查询数据结构时导致漏报。实际上,在字典的情况下,上面数组的每个元素都可以有一个与之关联的“值”,并且在一个位置中可以有多个元素(例如哈希冲突 http://en.wikipedia.org/wiki/Collision_%28computer_science%29)。此外,在决定将元素放置在何处时,我们通常会取数组大小的哈希值模。不过,不管所有这些细节如何,上面的示例仍然准确地传达了当对象的哈希码发生变化时可能出现的问题。

它会使解释器崩溃,或者破坏内部结构吗?

不,这不会发生。当我们说对象的哈希更改是“危险的”时,我们的意思是危险的,因为它本质上违背了哈希的目的,并使代码难以推理(如果不是不可能的话)。我们所说的危险并不是指它可能导致坠机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果对象的 __hash__ 发生变化,会发生什么? 的相关文章

  • 如何关闭python服务器

    使用此代码来运行 python 服务器 import os from http server import SimpleHTTPRequestHandler HTTPServer os chdir c users owner desktop
  • 如何使用 python 从嵌套表结构中识别最终父级?

    我有下表 我的问题是 我如何以编程方式识别最终父级 以下是通过示例解释的规则 the id 5 0的父母是51 0 身份证号51 0没有父母 因此 id5 0的最终父级是51 0 the id 6 0的父母是1 0 身份证号1 0的父母是1
  • Flask/Apache 提交按钮用于文件上传

    我有一个在 apache 后面运行的 Flask 应用程序 在我的 index html 页面上有一个文件上传按钮和一个提交按钮 如下所示
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • 代码 zip( *sorted( zip(units, error) ) ) 的作用是什么?

    对于我的申请units and errors始终是数值列表 我尝试用谷歌搜索每个部分的作用 并找出了 zip 的第一部分 它似乎 ziped list zip units errors 只需将单位和误差配对即可生成一个列表 如下所示 uni
  • python 类的属性不在 __init__ 中

    我想知道为什么下面的代码有效 usr bin env python3 import sys class Car def init self pass if name main c Car c speed 3 c time 5 print c
  • 不使用 graphviz/web 可视化决策树

    由于某些限制 我无法使用 graphviz webgraphviz com 可视化决策树 工作网络与另一个世界是封闭的 问题 是否有一些替代实用程序或一些 Python 代码用于至少非常简单的可视化可能只是决策树的 ASCII 可视化 py
  • 在 PyCharm 中运行命令行命令

    你好 我正在使用Python 但之前从未真正使用过它 我收到一些命令 需要在终端中运行 基本上 python Test py GET feeds 我正在使用 PyCharm 我想知道是否有办法从该 IDE 中运行这些相同的命令 按 Alt
  • Python:动态向对象添加字段

    我想知道是否可以动态向对象添加字段 例如 我希望能够添加如下内容 user object user first name John user last name Smith 当我在 Python 命令行解释器中执行该命令时 我得到 Attr
  • Pandas:向量化局部范围操作([i:i+2] 行的最大值和总和)

    我希望在数据帧中的每一行的局部范围内进行计算 同时避免速度缓慢for环形 例如 对于下面数据中的每一行 我想找到未来 3 天内 包括当天 的最高气温以及未来 3 天内的总降雨量 Day Temperature Rain 0 30 4 1 3
  • python 和 android 中通过 AES 算法加密和解密

    我有用于 AES 加密的 python 和 android 代码 当我在android中加密文本时 它在python上成功解密 但无法在android端解密 有人有想法吗 Python代码 import base64 import hash
  • 如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

    Scikit learn 具有相当用户友好的用于机器学习的 python 模块 我正在尝试训练用于自然语言处理 NLP 的 SVM 标记器 其中我的标签和输入数据是单词和注释 例如 词性标记 而不是使用双精度 整数数据作为输入元组 1 2
  • 如何使用 Python Pandas 制作 DataFrame 切片并在特定切片中“fillna”?

    问题 让我们从 Kaggle 获取泰坦尼克号数据集 我有包含 Pclass 性别 和 年龄 列的数据框 我需要用特定组的中位数填充 年龄 列中的 NaN 如果是来自一等的女性 我想用一等女性的中位数填写她的年龄 而不是整个年龄列的中位数 问
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • Python写入dbf数据时出错

    我得到这个错误 DbfError unable to modify fields individually except in with or Process 如何修复它 这是我的code with dbf Table aa dbf as
  • Numba jitclass 不适用于 python 列表

    我在用python 3 6 and numba 0 36 这个问题有一个sister https stackoverflow com questions 48159360 numba custom stack class and pop f
  • 在 Mac (Catalina) 上安装 PyGame 时出错 [重复]

    这个问题在这里已经有答案了 我一直在尝试将 PyGame 安装到 Catalina 上的 Mac 上 但不知道如何安装 我收到的错误消息是 SystemExit error command gcc failed with exit stat
  • 透视包含字符串的 Pandas Dataframe - “没有要聚合的数字类型”错误

    关于此错误有很多问题 但环顾四周后 我仍然无法找到 解决解决方案 我正在尝试用字符串旋转数据框 以使一些行数据变成列 但到目前为止还没有成功 我的 df 的形状
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试
  • Pymongo 批量插入

    我正在尝试批量插入文档 但批量插入时不会插入超过 84 个文档 给我这个错误 in insert pymongo errors InvalidOperation cannot do an empty bulk insert 是否可以批量插入

随机推荐

  • Pixi.js 中的自定义字体

    我尝试将自定义字体加载到 Pixi js 2D WebGL 框架 中 他们有一个使用 woff 谷歌字体的示例 https github com GoodBoyDigital pixi js tree master examples exa
  • 实体框架 Savechanges() 生成的订单 sql

    我正在查看在上下文中调用 SaveChanges 时执行的 sql 它确实按顺序更新 删除和插入 sql 语句 有没有办法将其更改为删除 更新 插入 我能想到的唯一方法就是打电话给你Delete 首先然后SaveChanges 然后做剩下的
  • 带 id 的 div 内多个标签的选择器

    在 jQuery 中 如何为 con 内的标签 h1 h2 h3 和 p 构建选择器 Like con h1 con h2 con h3 con p 但不重复 con 您可以执行以下任一操作 con h1 con h2 con h3 con
  • 如何为cmake中ExternalProject_Add的配置步骤添加对文件的依赖关系

    我正在尝试将一个不使用 cmake 的外部项目添加到我的项目中does使用cmake include ExternalProject ExternalProject Add MatrixSSL SOURCE DIR CMAKE CURREN
  • Prolog运算符在练习中的解释

    我在 Prolog 中有以下关于自然语言的练习 实现以下两个运算符has and of以这样的方式使用这样的短语 彼得有约翰的车回答以下问题 谁有 X 的什么 现在 我知道在英语中这听起来很糟糕 因为在英语中我们通常说 彼得有约翰的车 但我
  • IntPtr 算术

    我尝试以这种方式分配结构数组 struct T int a int b data Marshal AllocHGlobal count Marshal SizeOf typeof T 我想访问分配的数据 将结构 绑定 到分配的数组中的每个元
  • 如何为“Auth-Token”的Web服务添加令牌身份验证?

    我对 Web 服务比较陌生 但我有一个在 Visual Studio C 中使用 包装的 Web 服务 其结尾为Service asmx我在哪里做的Add Service Reference它吸收了所有显示的元素Service asmx w
  • C# 无法使用 TLS1.2 在 Windows 7/Windows Server 上创建 ssl/tls 安全通道

    我知道有很多人问这个问题 但我想我已经阅读了答案和问题很长时间了 但没有任何结果 我有一个调用 Web 服务的 C 应用程序 在 Windows 10 上一切正常 但当我在 Windows 7 或 Windows Server 2008 R
  • 未知的 GCC 链接器错误,但构建成功

    我正在尝试编译一个链接到 Eclipse C C IDE 中的 FMOD 库的程序 我什至没有包含任何库的标头 我只将共享库添加到项目依赖项中 并且出现以下链接错误 Building target Adventum Invoking GCC
  • 如何在单元测试期间捕获 Celery 任务?

    如何在不运行单元测试期间创建的 Celery 任务的情况下进行捕获 例如 我想编写一个如下所示的测试 def test add user avatar add user avatar tasks get deferred tasks ass
  • 通用列表上的 Linq OrderBy 返回不完全按字母顺序排列的列表

    我正在尝试使用对象名称属性对对象的通用列表进行排序 我正在使用 LINQ 但以下表达式不太有效 var query possibleWords OrderBy x gt x Name ToLower ToList foreach Word
  • 使用 PerformSelectorOnMainThread 调用非 void 函数

    正如我的问题的标题所说 我尝试使用以下命令调用非空函数performSelectorOnMainThread 我的函数返回UIImage 当我这样称呼它时 UImage img self performSelectorOnMainThrea
  • .net MemoryCache - 通知项目已删除

    我正在使用带有 NET 4 0 和 c 的 net 内存缓存 我希望在删除某个项目时通知我的应用程序 这样我可以将其已删除到日志文件中或通知 UI 该项目已移除 有没有办法做到这一点 我正在使用 System Runtime Caching
  • 使用 Spring Security 的 SpEL 格式查询 Spring Data JPA

    我有一个 Spring Data JPA 实体 Entity public class User private static final long serialVersionUID 1L Id private Long id 我想包括一个
  • 使用类似 Watin 的工具创建页面屏幕截图

    我需要通过向命令行工具提供页面 URL 来创建页面的屏幕截图 我发现了以下应用程序 将 HTML 转换为图像 http www converthtmltoimage com 这个工具还可以 但需要更灵活的应用 我需要有能力执行以下操作 转到
  • 更新应用程序或数据库中的时间戳列?

    我在数据库中的每个表上都有 date created 和 date modified 列 使用 MySQL 触发器在数据库中设置时间戳列与使用 PHP 在应用程序层设置时间戳列相比有何优点 缺点 当部署在许多服务器上时 哪个更容易维护并且具
  • 如何在Delphi中正确使用IFileOperation删除文件夹中的文件

    我正在尝试创建一个使用 IFileOperation 删除文件中的简单示例 给定目录 包含在另一个 q 的答案中 以便与其他方法进行比较 下面是我的代码MRE https stackoverflow com help minimal rep
  • Lua 从值中找到键

    我正在处理这个 chars Nigo Astran 1 pantera 2 nchar chars name 1 变量 name会给我一个我登录的字符串 在本例中 Nigo Astran and nchar有价值 2 如果我在 Nigo A
  • FileStream“无法访问关闭的文件”

    为什么我在使用时会收到上述错误消息using fileStream new FileStream path FileMode Append FileAccess Write 但是当我将其替换为时 程序可以完美执行fileStream Fil
  • 如果对象的 __hash__ 发生变化,会发生什么?

    在Python中 我知道这个值 hash 给定对象的返回值在该对象的生命周期内应该是相同的 但是 出于好奇 如果不是的话会发生什么 这会造成什么样的破坏 class BadIdea object def hash self return r