当前位置: 首页 > 面试题库 >

==运算符实际上在Python词典上做什么?

金英华
2023-03-14
问题内容

考虑:

>>> a = {'foo': {'bar': 3}}
>>> b = {'foo': {'bar': 3}}
>>> a == b
True

据蟒蛇文档,你的确可以使用该==辞书运营商。

这里到底发生了什么?Python是否递归检查字典的每个元素以确保相等?是否确保键完全匹配,并且值也完全匹配?

是否有文档确切说明==字典的含义?还是我必须实现自己的版本的相等性检查?

(如果==运算符起作用,为什么字典不能散列?也就是说,为什么我不能创建字典的set()或将字典用作字典键?)


问题答案:

Python递归检查字典的每个元素以确保相等。参见C
dict_equal()实现
,该实现检查每个键和值(假设字典的长度相同);如果字典b具有相同的键,则PyObject_RichCompareBool测试值是否也匹配;这本质上是一个递归调用。

字典不可散列,因为其__hash__属性设置为None,并且大多数字典都是
可变的 ,当用作字典键时是不允许的。

如果要使用字典作为键,并通过现有引用更改键,则该键将不再插入哈希表中的相同位置。现在,使用另一个相等的字典(等于未更改的字典或已更改的字典)尝试检索值将不再起作用,因为将选择错误的插槽,或者键将不再相等。



 类似资料:
  • 我只是第一次涉足iOS开发,我必须做的第一件事就是实现一个自定义容器视图控制器——让我们称之为SideBarViewController——它交换了几种可能的视图控制器中的哪一种它显示的子视图控制器,几乎与标准的Tab Bar Controller一模一样。(它几乎是一个标签栏控制器,但有一个可隐藏的侧菜单,而不是标签栏。) 根据Apple文档中的说明,每当我向容器中添加子ViewControll

  • 问题内容: 我在这里碰到了这个,总是这样使用: 什么是运营商做的,为什么不使用普通的或? 抱歉,如果以前没有回答,搜索引擎将不喜欢标点符号。 问题答案: http://docs.python.org/reference/expressions.html#notin说: [操作员]和是等效的;为了与C保持一致,是首选。[…]拼写被认为是过时的。

  • 问题内容: 我是Spark-DataFrame API的初学者。 我使用此代码将制表符分隔的csv加载到Spark Dataframe中 假设我从新文件中使用Spark创建了DataFrame,然后使用内置方法toPandas()将其转换为熊猫, 是否将Pandas对象存储到本地内存? 熊猫的低级计算是否全部由Spark处理? 它是否公开了所有熊猫数据框功能?(我想是的) 我可以将它转换为熊猫并完

  • 我是Spark DataFrame API的初学者。 我使用此代码将csv选项卡加载到Spark数据框中 假设我使用Spark从新文件创建DataFrame,并使用内置方法toPandas()将其转换为熊猫, 它是否将熊猫对象存储到本地内存 熊猫的低级计算全部由Spark处理吗 它是否公开了所有熊猫数据帧功能?(我想是的) 我可以将其转换为andas并直接使用它,而不需要太多接触数据帧API吗

  • 我正试图把我的头缠在Apache Mesos上,需要澄清几个项目。 我对Mesos的理解是,它是一个安装在集群中的每个物理/VM服务器(“节点”)上的可执行文件,然后提供一个Java API(不知何故),将每个单独的节点视为计算资源(CPU/RAM/等)的集体池。因此,对于使用Java API编码的程序,他们只看到一组资源,而不必担心如何/在哪里部署代码。 因此,首先,我在这里的理解可能是根本错误

  • 从文档中可以看出,-Xss用于设置JVM的堆栈大小。但我对这一说法感到非常困惑。 在Java中,每个线程都有自己的堆栈。-Xss指定的数字是否: > 线程的每个堆栈的大小。e、 如果将-Xss设置为256K,则每个线程将有一个256K大的堆栈。因此,10个线程将总共使用2560K。 非常感谢你。 编辑: 谢谢你的回答。看起来像是上面的(2)senario-Xss指定特定线程的最大堆栈大小。 然后我