gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:12:43 25 4
gpt4 key购买 nike

我对什么可以/不能用作 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

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

我有一个模糊的想法,即 key 必须是“可散列的”,但我承认我自己对技术细节一无所知;我不知道这里到底发生了什么。如果您尝试将列表用作键,而将哈希用作它们的内存位置,会出现什么问题?

最佳答案

Python wiki 中有一篇关于该主题的好文章:Why Lists Can't Be Dictionary Keys .如那里所述:

What would go wrong if you tried to use lists as keys, with the hash as, say, their memory location?

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

其他对象,如模块和 object 无论如何都会从它们的对象标识中获得更大的 yield (您上一次拥有两个名为 sys 的不同模块对象是什么时候? ),并且无论如何都要进行比较。因此,当它们用作 dict 键时,在这种情况下也会按身份进行比较,这并不令人惊讶 - 甚至是预期的。

关于python - 为什么我不能在 python 中使用列表作为 dict 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com