为什么可变内置对象在 Python 中不能进行哈希处理?这样做有什么好处呢?

2023-11-24

我来自 Java,即使是可变对象也可以是“可哈希的”。
这些天我玩 Python 3.x 只是为了好玩。

以下是 Python 中 hashable 的定义(来自 Python 术语表)。

hashable

如果一个对象有一个在其生命周期内永不改变的哈希值(它需要一个__hash__()方法),并且可以与其他对象进行比较(它需要一个__eq__()方法)。比较相等的可哈希对象必须具有相同的哈希值。

哈希性使得对象可以用作字典键和集合成员,因为这些数据结构在内部使用哈希值。

Python 的所有不可变内置对象都是可哈希的;可变容器(例如列表或字典)则不然。默认情况下,作为用户定义类实例的对象是可散列的。它们的比较都不相等(除了它们自己),它们的哈希值源自它们的id().

我读了它,我在想…… 仍然......为什么他们没有在 Python 中使可变对象可哈希?例如。使用相同的default对于用户定义的对象的哈希机制,即如上面最后两句所述。

默认情况下,作为用户定义类实例的对象是可散列的。它们的比较都不相等(除了它们自己),它们的哈希值来自它们的 id()。

这感觉有点奇怪......所以用户定义的可变对象是可散列的(通过这个默认的散列机制),但内置的可变对象是不可散列的。这不是让事情变得复杂吗?我不明白它能带来什么好处,有人可以解释一下吗?


在Python中,可变对象can是可散列的,但这通常不是一个好主意,因为一般来说,equality是根据这些可变属性来定义的,这可能会导致各种疯狂的行为。

如果内置可变对象根据身份进行哈希处理,就像用户定义对象的默认哈希机制一样,那么它们的哈希值将与其相等性不一致。那就是绝对地一个问题。然而,用户定义的对象默认情况下会根据身份进行比较和散列,因此情况并没有那么糟糕,尽管这组事务不是很有用。

请注意,如果您实施__eq__在用户定义的类中,__hash__被设定为None, 使班级不可散列的.

因此,来自 Python 3 数据模型文档:

用户定义的类有__eq__() and __hash__()方法通过 默认;与它们相比,所有对象都不相等(除了 他们自己)和x.__hash__()返回一个适当的值,使得x == y意味着这两者x is y and hash(x) == hash(y).

一个重写的类__eq__()并且没有定义__hash__()都会有它的__hash__()隐式设置为None。当。。。的时候__hash__()一个类的方法是None,当程序尝试检索时,该类的实例将引发适当的 TypeError 它们的哈希值,也将被正确识别为不可哈希 检查时isinstance(obj, collections.abc.Hashable).

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

为什么可变内置对象在 Python 中不能进行哈希处理?这样做有什么好处呢? 的相关文章

随机推荐

  • 检查核心数据中是否设置了属性?

    如何检查核心数据对象中是否设置了属性 我将所有核心数据对象加载到目录中 var formQuestions Questions 我的核心数据 NSManagementObject 是 NSManaged var noticeText Str
  • 如何在 this.props.children 中访问 React 对象的类名

    在一个 React 组件渲染方法中 在 this props children 中有一些子组件 如何获取每个子组件的组件 类 名称以区分它们 React Children map this props children function c
  • 将 .DLL 转换为 .SO

    你们中的任何人都可以帮我将 Windows dll 文件转换为 so 文件吗 您可以尝试将 dll 的源代码重新编译为共享对象 This在确保代码确实可移植后 可能会帮助您入门 Edit Here is 还有另一个链接它可以帮助指导您完成使
  • Xcode 正在 OS X 对象而不是 iOS 对象中加载

    我有一个 iOS 窗口应用程序 直到今天它都可以与 Xcode 正常运行 当我在对象库中打开项目时 它似乎加载了所有 OS X 开发对象 并且我再也看不到任何可可触摸项目 如 UITextViews 等 我没有手动更改任何设置 所以我不确定
  • 如何更改现有表以在 Oracle 中创建范围分区

    我现有的表包含 10 年的数据 我已转储 我想在表中的一个日期键列上对现有表进行范围分区 我看到的大多数例子都是CREATE TABLE PARTITION BY RANGE 添加新分区 但我的表是现有的表 我想我需要一些ALTER陈述 A
  • 如何在 C++ 中声明原子向量

    我打算声明一个原子变量向量 用作多线程程序中的计数器 这是我尝试过的 include
  • 在曲线边缘绘制箭头

    灵感来自这个问题在 Ask sagemath 什么是best将箭头添加到生成的曲线末尾的方法Plot ContourPlot ETC 这些是高中时看到的绘图类型 表明曲线从页面末尾继续延伸 经过一番搜索 我找不到内置的方法或最新的包来执行此
  • std::launder 如何影响容器?

    考虑以下固定大小向量的简化且不完整的实现 template
  • Find() 与 FirstOrDefault() 的性能[重复]

    这个问题在这里已经有答案了 类似问题 Find 与Where FirstOrDefault 在具有单个字符串属性的简单引用类型的大序列中搜索 Diana 得到了一个有趣的结果 using System using System Collec
  • Alamofire:[结果]:失败:错误域=NSURLErrorDomain代码=-999“已取消”

    我正在连接的服务使用自签名证书 出于开发目的 我不想验证该链 将 swift 3 与 Alamofire 4 结合使用 相应地修复了 ATS
  • 从文件中删除所有以 # 开头的行

    文件中所有带有注释的行都以 如何删除以以下内容开头的所有行 并且仅删除那些行 其他行包含 但不在行开头的应被忽略 这可以通过sed 单行 sed d 这表示 找到所有以 开头的行并将其删除 保留其他所有内容
  • 在运行时,Swift 如何知道要使用哪个实现?

    protocol A func f struct S1 A func f print S1 struct S2 A func f print S2 let array A S1 S2 for s A in array s f S1 n S2
  • 创建两个二维 pandas 数据框的组合

    我有两个 pandas 数据框 df1 和 df2 我想创建一个数据框 df3 其中包含使用 df1 中的一列和 df2 中的一列的所有组合 低效执行此操作的伪代码如下所示 df3 for i in df1 for j in df2 df3
  • 错误“env”未被识别为内部或外部命令?

    我是node js的新手 我已经安装了node js并使用command npm v检查了它的工作正常 我尝试测试它构建开源项目 github https github com quran quran com frontend 运行该项目的
  • 使所有图像在引导程序中以相同的高度显示

    我试图使所有一行 4 个图像都具有相同的高度尺寸 我已经尝试使用 css 来调整宽度和高度 但似乎没有任何效果 纵向图像最终总是比横向图像高 这是代码 div class container div class jumbotron styl
  • 固定元素的百分比宽度?

    我有这样的html div div div div div div content width 100 position relative padding 20px first width 70 position relative seco
  • 为什么我的线程 .Net 应用程序在分配大量内存时不能线性扩展?

    我遇到了一些关于大内存分配对 Net 运行时可扩展性的影响的奇怪问题 在我的测试应用程序中 我在固定循环次数的紧密循环中创建了大量字符串 并给出了每秒循环迭代的速率 当我在多个线程中运行这个循环时 奇怪的事情出现了 速度似乎并没有线性增加
  • 使用 matplotlib 中的多个补丁剪辑图像

    我在 pylab 中有一个图 我想将其剪辑到英国地图的边界 我还制作了一系列补丁 其中包含每个国家的轮廓 一个代表英格兰 一个代表威尔士等 剪辑一个补丁的情节效果非常好 fig plt figure ax fig add subplot 1
  • 每三个 div 包裹一个 div

    假设我有 6 个子 div 它们没有唯一标识符 div class child div div class child div div class child div div class child div div class child
  • 为什么可变内置对象在 Python 中不能进行哈希处理?这样做有什么好处呢?

    我来自 Java 即使是可变对象也可以是 可哈希的 这些天我玩 Python 3 x 只是为了好玩 以下是 Python 中 hashable 的定义 来自 Python 术语表 hashable 如果一个对象有一个在其生命周期内永不改变的