如果哈希值是从唯一的对象 ID 计算的,那么在 Python 中使用可变对象作为字典键可能会出现什么问题?

What are the possible problems with using a mutable object as a dictionary key in Python if the hash is calculated from the unique object ID?

提问人:Custal 提问时间:6/27/2022 更新时间:6/27/2022 访问量:100

问:

在 Python 中,只要定义了哈希函数,就可以将可变对象用作字典键(例如用户定义的类)。默认情况下,用户定义的类使用对象 ID 的函数作为其哈希值,对于给定的 Python 实例,哈希值保证为 unqiue。我看到很多帖子询问是否可以使用可变对象作为字典键,是的,但我的问题是你应该使用可变对象作为字典键吗?这样做可能会出现哪些问题?

我感兴趣的具体上下文是当使用字典将对象映射到其他对象时,其中键引用一个对象,值是您要映射到的另一个对象。使用字符串 ID 作为键似乎是最明显的方法,但是在大多数情况下,会出现这种模式,然后我使用字符串 ID 从其他地方(可能是另一个字典)获取实际对象。与其使用字符串 ID 作为键,为什么不去掉中间人,而只使用对象本身作为键呢?

我能想到的这种方法的唯一问题是,你牺牲了在对象上定义一个相等的方法,该方法通过对象内容而不是对象 id 进行比较。然而,就像 Python 中的许多事情一样,仅仅因为你可以做某事并不意味着你应该这样做,所以我对这种方法是否有任何其他潜在的陷阱感兴趣,我应该注意。

字典 散 列 钥匙 可变

评论

1赞 user2357112 6/27/2022
如果相等也适用于 ID(这是默认行为),那么这完全没问题。许多可变对象已经像这样工作了,包括许多内置和 stdlib 类型(例如,函数就是这样做的)。
0赞 Davis Herring 8/27/2022
所以:你是在问你使用身份的情况,还是你不使用身份的情况?有时甚至后者也可以工作,但它很容易出错。
0赞 Custal 8/29/2022
我猜两者都有。我问的是,无论您使用哪种方法允许它,使用可变对象作为密钥是否都是不好的做法。

答: 暂无答案