首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python:如果字典中没有键,为什么不调用__eq__()?

在Python中,字典是一种无序的数据结构,用于存储键值对。当我们使用字典时,如果我们尝试访问一个不存在的键,Python会抛出KeyError异常。这是因为字典的实现方式使用了哈希表,通过哈希函数将键映射到对应的存储位置,从而实现快速的键值查找。

在字典中,如果我们尝试访问一个不存在的键,Python会根据键的哈希值来确定键在字典中的位置,然后在该位置上查找对应的值。如果在该位置上没有找到对应的值,Python会认为该键不存在于字典中,因此会抛出KeyError异常。

在这个过程中,Python并不会调用键的eq()方法来比较键的相等性。这是因为在查找键时,Python首先根据键的哈希值确定键的位置,然后在该位置上进行查找。只有在找到对应的位置后,才会调用键的eq()方法来判断键的相等性。

因此,如果字典中没有键,Python不会调用eq()方法,而是直接抛出KeyError异常。这是字典实现的一种设计决策,旨在提高字典的查找效率。

总结起来,当字典中没有键时,不调用eq()是因为字典的查找过程是先根据键的哈希值确定位置,然后在该位置上进行查找,只有在找到位置后才会调用eq()方法来判断键的相等性。

相关搜索:如果python中的键是数字,有没有办法按键对字典进行排序?将int添加到Python字典现有键中,而不覆盖所述键Python :检查嵌套字典中的特定键,如果匹配,则返回所有以前的键为什么我不能向字典中添加更多的键?- Python从键和子键中检索所有嵌套值,直到python字典中没有键为止为什么函数调用在字典中的python中不起作用有没有办法使用函数参数来调用字典中的键?Python将列表中以逗号分隔的单词替换为字典值(如果存在于字典键中为什么python只打印字典中的最后一个键?如果直接在协程块中调用,为什么`async`不继承SupervisorJob?为什么python可能会覆盖与尚未调用的字典键相关联的值?为什么在键/值__dict__赋值中调用__getattribute__?PythonPython:如何使用字典来调用方法(字典中的值),以便根据不同函数中的用户输入(字典中的键)运行?如果列表中没有键和值对,则使用python跳过此数据将两个不相等的列表合并到字典中。如果key没有值,则指定none。忽略值没有键- pythonPython :如果键匹配,则使用另一个字典中的值更新字典中的数组统计嵌套字典中具有相同值的键的出现次数,如果python中的键出现次数超过x,则删除函数没有在Python中调用,为什么?我该如何解决?有没有一种方法可以更新Python字典的值,而不添加不存在的键?如果在回调中调用toggleClass,为什么jQuery.fadeTo没有动画效果?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

详解Python的可哈希对象与不可哈希对象(二)

因为所有类型的基类object实现了这两个魔术方法,但是并不是说有这两个方法就一定是可哈希的,关键是要如何实现__eq__()方法和__hash__()方法,list并没有实现,只是有这几个魔术方法而已...三、为什么字典 key 必须是不可变的(可哈希hashable)? 3.1 字典如何在 CPython 实现? CPython 的字典实现为可调整大小的哈希表。...字典的工作方式是使用 hash() 内置函数计算字典存储的每个的 hash 代码。...3.2 字典 key 必须是不可变的(可哈希hashable) 字典的哈希表实现使用从键值计算的哈希值来查找。 (1)为什么可变对象不能作为Key?...(2)为什么不可变对象能作为Key?

10.2K63
  • Python 哈希(hash) 散列

    如果要把一个对象放入散列表,那么首先要计算这个元素的散列值。 Python 可以用 hash() 方法来做这件事情: 内置的 hash() 方法可以用于所有的内置类型对象。...如果 search_key 和 found_key 匹配的话,这种情况称为散列 冲突。...往字典里添加新可能会改变已有的顺序 无论何时往字典里添加新的Python 解释器都可能做出为字典扩容的决定。扩容导致的结果就是要新建一个更大的散列表,并把字典里已有的元素添加到新表里。...如果你在迭代一个字典的所有的过程同时对字典进行修改,那么这个循环很有可能会跳过一些——甚至是跳过那些字典已经有的。...set的实现以及导致的结果 set 和 frozenset 的实现也依赖散列表,但在它们的散列表里存放的只有元素的引用(就像在字典里只存放没有相应的值)。

    2.3K20

    《流畅的Python》学习笔记之字典

    ) index[new_key].append(new_value) 这里我们新建了一个字典 index,如果在 index 不存在,表达式会按以下步骤来操作: 调用 list() 来建立一个新的列表...不过,如果有一个类继承了 dict ,然后这个继承类提供了 __missing__ 方法,那么在 __getitem__ 碰到找不到的时候,Python 会自动调用它,而不是抛出一个 KeyError...,key): # 先按传入的查找,如果没有再把转为字符串再找一次 returnkeyinself.keys()orstr(key)inself.keys() __contains__ 方法存在是为了保持一致性...这时需要校验 search_key == found_key,如果相等,返回 found_value。如果匹配(散列冲突),再在散列表再取几位,然后处理一下,用处理后的结果当做索引再找表元。...5、往字典里添加新可能会改变已有的顺序 无论何时向字典添加新的Python 解释器都可能做出为字典扩容的决定。

    2K100

    Python:What the f*ck Python(下)

    而 SomeClass("s") == "s" 为 True 是因为 SomeClass 也继承了 str 类 __eq__ 方法。 由于两者的哈希值相同且相等,所以它们在字典中表示相同的。...如果想要实现期望的功能, 我们可以重定义 SomeClass 的 __eq__ 方法. class SomeClass(str): def __eq__(self, other): return...在不同的Python实现删除的处理方式以及调整大小的时间可能会有所不同,python3.6开始,到5就会扩容。...del、remove、pop 的不同: del var_name 只是从本地或全局命名空间中删除了 var_name(这就是为什么 list_1 没有受到影响)。...pop 则会删除指定索引处的元素并返回它,如果指定了无效的索引则抛出 IndexError 异常。 为什么输出是 [2, 4]?

    1.7K50

    27 个问题,告诉你Python为什么这么设计

    目录 为什么Python使用缩进来分组语句? 为什么简单的算术运算得到奇怪的结果? 为什么浮点计算不准确? 为什么Python字符串是不可变的? 为什么在方法定义和调用显式使用“self”?...CPython退出时为什么释放所有内存? 为什么有单独的元组和列表数据类型? 列表是如何在CPython实现的? 字典是如何在CPython实现的? 为什么字典key必须是不可变的?...如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。 难道不能在解释器模拟线程,而非得依赖特定于操作系统的线程实现吗?...字典的哈希表实现使用从键值计算的哈希值来查找如果是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。...当然,Python允许您草率行事,根本不编写测试用例。 为什么没有goto? 可以使用异常捕获来提供 “goto结构” ,甚至可以跨函数调用工作的 。

    6.7K11

    深度剖析Python字典和集合

    字典这个数据结构活跃在所有Python程序的背后,即便你的源码里并没有直接用到它”,摘抄自《代码之美》第18章Python字典类:如何打造全能战士。字典Python语言的基石!...另外可散列对象还要有__eq__()方法,这样才能跟其他做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的。” 重点是散列值不变!...default_factory默认为None,如果指定,查询不存在的会触发KeyError,这个道理和[]取值是一样的。 所有这一切背后的功臣其实是魔法方法__missing__。...基类dict并没有定义这个方法,但是dict是能知道它的,如果一个类继承了dict,然后实现了__missing__方法,Python就会自动调用它,而不是抛出一个KeyError异常。...为什么要用稀疏数组?举个例子,身份证号411697199702076425,如果把它作为存储到数组,虽然能用O(1)时间就找到,但是需要开辟一个999999999999999999大的空间。

    1.6K00

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。 11. 难道不能在解释器模拟线程,而非得依赖特定于操作系统的线程实现吗?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。...字典的哈希表实现使用从键值计算的哈希值来查找如果是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。...当然,Python 允许您草率行事,根本不编写测试用例。 23. 为什么没有 goto? 可以使用异常捕获来提供 “goto 结构” ,甚至可以跨函数调用工作的 。...为什么 Python 没有属性赋值的“with”语句? Python 有一个 'with' 语句,它封装了块的执行,在块的入口和出口调用代码。

    2.7K10

    Python 核心设计理念27个问题及解答

    如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。 11. 难道不能在解释器模拟线程,而非得依赖特定于操作系统的线程实现吗?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。...字典的哈希表实现使用从键值计算的哈希值来查找如果是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。...当然,Python 允许您草率行事,根本不编写测试用例。 23. 为什么没有 goto? 可以使用异常捕获来提供 “goto 结构” ,甚至可以跨函数调用工作的 。...为什么 Python 没有属性赋值的“with”语句? Python 有一个 with 语句,它封装了块的执行,在块的入口和出口调用代码。

    3.3K21

    Python官方二十七问,你知道个啥?

    如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。 11. 难道不能在解释器模拟线程,而非得依赖特定于操作系统的线程实现吗?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。...字典的哈希表实现使用从键值计算的哈希值来查找如果是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。...当然,Python 允许您草率行事,根本不编写测试用例。 23. 为什么没有 goto? 可以使用异常捕获来提供 “goto 结构” ,甚至可以跨函数调用工作的 。...为什么 Python 没有属性赋值的“with”语句? Python 有一个 'with' 语句,它封装了块的执行,在块的入口和出口调用代码。

    2.5K20

    非常全的通俗易懂 Python 魔法方法指南

    注意,如果调用者试图调用 str() 而你的类只实现了 __unicode__() ,那么类将不能正常工作。所有你应该总是定义 __str__() ,以防有些人没有闲情雅致来使用unicode。...在Python,协议完全是非正式的,也不需要显式的声明,事实上,它们更像是一种参考标准。 为什么我们要讲协议?因为在Python实现自定义容器类型需要用到一些协议。...你可能好奇为什么这个方法不是序列协议的一部分,原因是,如果 contains 没有定义,Python就会迭代整个序列,如果找到了需要的一项就返回 True 。...__missing__(self ,key) __missing__ 在字典的子类中使用,它定义了当试图访问一个字典不存在的时的行为(目前为止是指字典的实例,例如我有一个字典 d , "george..." 不是字典的一个,当试图访问 d["george'] 时就会调用 d.

    1.9K32

    27 个问题,告诉你Python为什么这么设计?

    如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。 难道不能在解释器模拟线程,而非得依赖特定于操作系统的线程实现吗?...CPython退出时为什么释放所有内存? 当Python退出时,从全局命名空间或Python模块引用的对象并不总是被释放。...假设您存储的都具有不同的hash值,这意味着字典需要恒定的时间 -- O(1),用Big-O表示法 -- 来检索一个为什么字典key必须是不可变的?...字典的哈希表实现使用从键值计算的哈希值来查找如果是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。...当然,Python允许您草率行事,根本不编写测试用例。 为什么没有goto? 可以使用异常捕获来提供 “goto结构” ,甚至可以跨函数调用工作的 。

    3.1K20

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。 11. 难道不能在解释器模拟线程,而非得依赖特定于操作系统的线程实现吗?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。...字典的哈希表实现使用从键值计算的哈希值来查找如果是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改对象都无法判断它是否被用作字典键值,因此无法在字典修改条目。...当然,Python 允许您草率行事,根本不编写测试用例。 23. 为什么没有 goto? 可以使用异常捕获来提供 “goto 结构” ,甚至可以跨函数调用工作的 。...为什么 Python 没有属性赋值的“with”语句? Python 有一个 'with' 语句,它封装了块的执行,在块的入口和出口调用代码。

    2.6K20

    字典核心底层原理

    将一个键值对放进字典的底层过程 a = {} a["name"]="gaoqi" 假设字典a对象创建完后,数组长度为8: 我们要把”name”=”gaoqi”这个键值对放到字典对象a,首先第一步需要计算...Python可以通过hash()来计算。...>>> a.get("name") 'tiantian' 当调用a.get(“name”),就是根据“name”查找到“键值对”,从而找到值对象“gaoqi”。...依次取完后,仍然没有找到。则返回None。流程图如下: 用法总结: 字典在内存开销巨大,典型的空间换时间。 查询速度很快 往字典里面添加新键值对可能导致扩容,导致散列表中键的次序变化。...因此,不要在遍历字典的同时进行字典的修改 必须可散列 数字、字符串、元组,都是可散列的 自定义对象需要支持下面三点:(面向对象章节再展开说) 支持hash()函数 支持通过__eq

    13210

    python基础八

    __str__()方法,友谊之前我们没有写这个方法,所以就会调用object的__str__方法,因为所有没有继承的类,默认是继承object类的,在子类没有找到__str__方法就会去父类object...如果我们写repr方法,它就会调用父类的方法,会输出一个内存地址。...注:当我们在类写了repr方法,没有写str方法,我们再次输出str(Person)他不会输出内存地址,会输出repr的内容,我们理解为他找不到str方法就会找repr方法,repr方法再没有就会输出内存地址...注:放我们调用完这个一会执行__del__方法,但是没有删除变量。python这个方法内部有个引用计数机制, 当计数为0的时候,就会删除这个属性。来释放内存。...__new__(A,*args,**kwargs) __new__可以决定调用哪个类的_init_方法,如果有两个类,并且是继承关系,就可以选择调用父类的__init__方法,__init__的self

    44430

    Python学习手册之内部方法、操作符重

    但是,如果 x 没有实现 __add__ 方法并且 x 和 y 是不同的类型,那么会调用 y.__radd__(x)。 对于上面提到的所有方法,都有相等的添加 r 前缀的方法。...= __gt__ 表示运算符 > __ge__ 表示运算符 >= 如果没有实现 __ne__ ,则返回 __eq__ 相反的值。其他运算符之间没有这样的关系。..._getitem__ name Python __delitme__ name >>> 键值读取函数 __getitem__ 还可以根据表达式返回字典的 key,__setitem__ 设置 key...如果没有任何变量引用它(它的引用计数为零),意味着没有任何东西可以与其交互,因此可以安全地删除它。在此也可以被删除。del 语句将对象的引用计数减少一个,这通常会导致对象被删除。...del 语句调用对象的方法 __del__。 在不再需要对象是删除对象的过程称为垃圾收集。对象的引用计数在分配新名称或放在容器 (列表、元组或字典) 时会增加。

    40010

    用is探索python的隐藏机制

    默认会调用对象的 __eq__()方法。 1.21比20不只多1 首先我们来看一段代码演示: image.png 这是不是很惊喜?是不是很意外?20跟21有什么区别为什么结果不一样?...image.png 为什么这个函数执行到第一个return的时候没有退出?为什么会执行剩下的语句?为什么最后显示的finally?...5.字典里的javaScript被吃了? image.png 这称之为哈希冲突, Python字典检查相等性并比较哈希值以确定两个是否相同。...具有相同值的不可变对象在Python始终具有相同的哈希值。...False test_dict[5] = "Python"执行该语句时,现有值“JavaScript”将被“Python”覆盖,因为Python识别5等同5.0作为字典的相同 6.除了break提前结束

    46010

    Python内置(4)类相关的内置

    要理解为什么对象只与它们自己进行比较,我们必须理解关键字is。 Python的is运算符用于检查两个值是否引用内存相同的确切对象。...这是因为它们使用哈希值作为“索引”的替代品,并且如果相同哈希的值已经存储在集合/字典Python可以快速检查它是否是同一项目。此过程使检查是否存在几乎是即时的。...dir and vars: 一切都是字典 你有没有想过Python如何存储对象,它们的变量及方法?我们知道所有对象都有自己的属性和方法,但是Python究竟如何跟踪它们呢?...如果vars显示一个类的所有方法,那么下面这个问题是为什么: >>> class C: ......但是要实际执行此操作,您可以使用 getattr,它接收一个字符串,就像字典一样: >>> class X: ...

    2.4K30
    领券