哈希方法在python 2中是默认的,而不是在python 3中

哈希方法在python 2中是默认的,而不是在python 3中,python,hash,Python,Hash,我在将一些代码从Python2转换到Python3时遇到了一个奇怪的行为示例。下面是一个简单的例子: class Bar(object): def __init__(self, x): self.x = x def __eq__(self, other): return self.x == other.x b = Bar(1) print(hash(b)) 当使用python2运行时,此代码会生成一些输出,其中包含Bar1的散列,而pytho

我在将一些代码从Python2转换到Python3时遇到了一个奇怪的行为示例。下面是一个简单的例子:


class Bar(object):
    def __init__(self, x):
        self.x = x
    def __eq__(self, other):
        return self.x == other.x

b = Bar(1)
print(hash(b))
当使用python2运行时,此代码会生成一些输出,其中包含Bar1的散列,而python3会导致TypeError:unhabable type:'Bar'

这意味着_u散列_uu以某种方式从对象继承?在python 2中

所以,我的问题是:python 2中Bar1的哈希是什么?为什么这种行为不同于

重写eq且不定义哈希的类将 将其哈希隐式设置为“无”。当哈希方法 如果某个类的实例为“无”,则该类的实例将引发相应的 当程序试图检索其哈希值时出现TypeError,以及 检查时也将正确识别为不可损坏 isinstanceobj,collections.abc.Hashable

有关Python 2版本的信息,请参阅。

From

重写eq且不定义哈希的类将 将其哈希隐式设置为“无”。当哈希方法 如果某个类的实例为“无”,则该类的实例将引发相应的 当程序试图检索其哈希值时出现TypeError,以及 检查时也将正确识别为不可损坏 isinstanceobj,collections.abc.Hashable


有关Python 2版本,请参阅。

是,数据模型已更改:

用户定义的类通过 违约有了它们,所有对象都会比较不相等,除了 它们自身和x.uu散列返回一个适当的值,以便 x==y意味着x是y,hashx==hashy

重写_ueq _uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。当 __类的hash_u方法为None,当程序尝试检索时,该类的实例将引发适当的TypeError 它们的哈希值,也将被正确标识为不可损坏 检查isinstanceobj时,collections.abc.Hashable

因此,由于您明确定义了一个_eq _,但没有定义一个_hash _,Python 3对象将隐式地具有_hash _=None,从而导致对象无法处理

在:

用户定义的类通过 违约有了它们,所有对象都会比较不相等,除了 它们本身和x.uu散列返回从idx派生的结果


所以它是基于身份的哈希,这是一个问题,因为它与你的eq不一致。这就是Python 3切换行为的原因。

是的,数据模型已更改:

用户定义的类通过 违约有了它们,所有对象都会比较不相等,除了 它们自身和x.uu散列返回一个适当的值,以便 x==y意味着x是y,hashx==hashy

重写_ueq _uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。当 __类的hash_u方法为None,当程序尝试检索时,该类的实例将引发适当的TypeError 它们的哈希值,也将被正确标识为不可损坏 检查isinstanceobj时,collections.abc.Hashable

因此,由于您明确定义了一个_eq _,但没有定义一个_hash _,Python 3对象将隐式地具有_hash _=None,从而导致对象无法处理

在:

用户定义的类通过 违约有了它们,所有对象都会比较不相等,除了 它们本身和x.uu散列返回从idx派生的结果


所以它是基于身份的哈希,这是一个问题,因为它与你的eq不一致。这就是Python3切换行为的原因。

第二个链接只显示x.\uuuuu hash\uuuuuu返回从idx派生的结果。。我如何看到结果是如何派生的?您可以在这里的注释中看到关于不同版本Python的一些讨论:第二个链接仅显示x.。uuu hash_uuuu返回从idx派生的结果。。我如何看到结果是如何产生的?您可以在这里的评论中看到关于不同版本Python的一些讨论: