为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能在python中使用列表作为dict键?

为什么我不能在python中使用列表作为dict键?

一只名叫tom的猫 2019-08-02 16:47:05
为什么我不能在python中使用列表作为dict键?关于什么可以/不能用作python dict的键,我有点困惑。dicked = {}dicked[None] = 'foo'     # None okdicked[(1,3)] = 'baz'    # tuple okimport sysdicked[sys] = 'bar'      # wow, even a module is ok !dicked[(1,[3])] = 'qux'  # oops, not allowed所以一个元组是一个不可变的类型,但是如果我在其中隐藏一个列表,那么它就不能成为一个键......难道我不能轻易地隐藏模块中的列表吗?我有一个模糊的想法,关键是必须“可以”,但我只是承认自己对技术细节的无知; 我不知道这里到底发生了什么。如果您尝试使用列表作为键,将哈希作为其内存位置,会出现什么问题?
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

在Python维基中有一篇关于这个主题的好文章:为什么列表不能是字典键。如上所述:

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

它可以在不破坏任何要求的情况下完成,但会导致意外行为。列表通常被视为其值来自其内容的值,例如在检查(in-)相等时。许多人 - 可以理解 - 希望你可以使用任何列表[1, 2]来获得相同的密钥,在那里你必须保持完全相同的列表对象。但是,一旦用作密钥的列表被修改,就会通过值中断进行查找,并且对于按身份查找,需要您保持完全相同的列表 - 这对于任何其他常见列表操作都是不需要的(至少我无法想到)。

其他对象,比如模块,object无论如何都要从它们的对象身份中做出更大的交易(当你最后一次调用两个不同的模块对象时sys?),并且无论如何都要进行比较。因此,当用作字典键时,它们在这种情况下通过身份进行比较也就不那么令人惊讶 - 甚至是预期的。


查看完整回答
反对 回复 2019-08-02
?
守着一只汪

TA贡献1872条经验 获得超3个赞

为什么我不能在python中使用列表作为dict键?

>>> d = {repr([1,2,3]): 'value'}{'[1, 2, 3]': 'value'}

(对于任何偶然发现这个问题寻找方法的人)

正如其他人在这里解释的那样,确实你不能。但是,如果您真的想使用列表,则可以使用其字符串表示。


查看完整回答
反对 回复 2019-08-02
?
UYOU

TA贡献1878条经验 获得超4个赞


问题是元组是不可变的,而列表则不是。考虑以下


d = {}

li = [1,2,3]

d[li] = 5

li.append(4)

应该d[li]返回什么?是同一个名单吗?怎么样d[[1,2,3]]?它具有相同的值,但是列表不同?


最终,没有令人满意的答案。例如,如果唯一有效的密钥是原始密钥,那么如果您没有引用该密钥,则永远不能再次访问该值。使用其他所有允许的密钥,您可以构建密钥而无需引用原始密钥。


如果我的两个建议都有效,那么你有非常不同的键返回相同的值,这有点令人惊讶。如果只有原始内容有效,那么您的密钥将很快变坏,因为要对列表进行修改。


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 1123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信