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

为什么我不能在Python中使用列表作为字典键?

魏楷
2023-03-14
问题内容

对于什么可以/不能用作python dict的键,我有些困惑。

dicked = {}
dicked[None] = 'foo'     # None ok
dicked[(1,3)] = 'baz'    # tuple ok
import sys
dicked[sys] = 'bar'      # wow, even a module is ok !
dicked[(1,[3])] = 'qux'  # oops, not allowed

因此,元组是不可变的类型,但是如果我在其中隐藏一个列表,那么它就不能成为键。.我不能像在模块内部一样轻松地隐藏一个列表吗?

我有一个模糊的想法,认为密钥必须是“可哈希的”,但是我只是承认自己对技术细节的无知。我不知道这里到底发生了什么。如果您尝试使用列表作为键,而将哈希作为其存储位置,那会出什么问题呢?


问题答案:

Python
Wiki中有一篇有关该主题的好文章:为什么列表不能成为字典键。如此处所述:

如果您尝试使用列表作为键,而将哈希作为其存储位置,那会出什么问题呢?

可以在不真正破坏任何要求的情况下完成此操作,但是会导致意外的行为。列表通常被视为其值是从其内容的值派生的,例如在检查(不相等)时。可以理解的是,许多人希望您可以使用任何列表[1, 2]来获取相同的键,而您必须在其中保留完全相同的列表对象。但是,一旦修改了用作键的列表,按值查找就会中断,并且对于按标识查找,您需要保持完全相同的列表-
这不需要任何其他常见的列表操作(至少我不能想到) )。

object无论如何,其他对象(例如模块)在它们的对象标识中的作用要大得多(这是您最后一次有两个名为sys?的不同模块对象),并且无论如何都要进行比较。因此,当它们用作dict键时,在这种情况下也按标识进行比较就不足为奇了,甚至不出所料。



 类似资料:
  • 问题内容: 例: Python是(非常)面向对象的,我不理解为什么对象不继承“ len”功能。另外,我一直在尝试错误的解决方案,因为它对我来说似乎是合乎逻辑的 问题答案: Guido的解释在这里: 首先,出于HCI的原因,我选择len(x)而不是x.len()(def len ()来得晚)。实际上,HCI有两个相互交织的原因: (a)对于某些运算,前缀表示法比后缀读得更好-前缀(和infix!)运

  • 问题内容: 我正在尝试转换以下列表: 像这样的字典: 我尝试了其他职位的答案,但没有任何帮助。我现在有以下代码: 这给了我这个错误: 任何帮助深表感谢。谢谢。 问题答案: 您可以从内置的枚举中获取列表的索引。您只需要反转索引值映射并使用字典理解来创建字典 哦,永远不要将变量命名为内置变量或类型。

  • 我已经检查了我的windows10机器上是否安装了python 3.8。我正在尝试安装带有pip的软件包,但终端告诉我,“[pip”不被识别为内部或外部命令、可操作程序或批处理文件。] 我知道3.4以上的Python版本已经预装了pip,那么为什么我会收到这个错误消息呢?

  • 问题内容: 我正在研究列表和元组之间的区别(在Python中)。一个明显的例子是,元组是不可变的(在初始赋值后不能更改值),而列表是可变的。 文章中的一句话让我明白了: 只能将不可变元素用作字典键,因此只能将元组而不是列表用作键。 我很难考虑要使用元组作为字典键的情况。您能否提供一个示例问题,说明这是自然,高效,优雅或显而易见的解决方案? 编辑: 感谢您的示例。到目前为止,我认为一个非常重要的应用

  • 我正在尝试使用文件系统。我的< code>CMakeLists.txt中有< code>-std=c 11 -std=c 1y。GCC版本为4.9.2。然而,我得到了一个错误: 使用的正确方法是什么?

  • 问题内容: 在Python 2.7中,我可以将字典键,值或项作为列表获取: 现在,在Python> = 3.3中,我得到如下信息: 因此,我必须这样做以获得列表: 我想知道,是否有更好的方法在Python 3中返回列表? 问题答案: 尝试。 这会将对象转换为列表。 另一方面,你应该问自己是否重要。的编码方式是假设鸭子输入(如果看起来像鸭子,而像鸭子一样嘎嘎叫,那就是鸭子)。在大多数情况下,该对象的