gpt4 book ai didi

python - 为什么字典键被转换为继承的类类型?

转载 作者:太空狗 更新时间:2023-10-29 21:19:15 24 4
gpt4 key购买 nike

我的代码看起来像这样:

class SomeClass(str):
pass

some_dict = {'s':42}

>>> type(some_dict.keys()[0])
str
>>> s = SomeClass('s')
>>> some_dict[s] = 40
>>> some_dict # expected: Two different keys-value pairs
{'s': 40}
>>> type(some_dict.keys()[0])
str

为什么Python在更新字典some_dict时将对象s转换为字符串“s”?

最佳答案

hash值虽然有关系,但不是主要因素。 在这里,平等更为重要。也就是说,对象可能具有相同的哈希值而不是相等的,但相等的对象必须具有相同的哈希值(虽然这不是严格强制执行的)。否则,在使用 dictset 时,您会遇到一些奇怪的错误。

因为您没有在 SomeClass 上定义 __eq__ 方法,所以您继承了 str 上的方法。 Python 的内置函数被构建为允许子类化,所以 __eq__ 返回 true,如果对象在其他情况下是相等的,因为它们不是具有不同的类型。例如。 's' == SomeClass('s') 为真。因此,'s'SomeClass('s') 相当于字典的键是正确和恰当的。

要获得您想要的行为,您必须重新定义 __eq__ dunder 方法以考虑类型。但是,当您定义自定义 equals 时,python 会停止为您提供自动 __hash__ dunder 方法,您也必须重新定义它。但在这种情况下,我们可以重用 str.__hash__

class SomeClass(str):
def __eq__(self, other):
return (
type(self) is SomeClass
and type(other) is SomeClass
and super().__eq__(other)
)

__hash__ = str.__hash__

d = {'s': 1}
d[SomeClass('s')] = 2

assert len(d) == 2
print(d)

打印:{'s': 2, 's': 1}

关于python - 为什么字典键被转换为继承的类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48135593/

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