哈希方法在python 2中是默认的,而不是在python 3中
我在将一些代码从Python2转换到Python3时遇到了一个奇怪的行为示例。下面是一个简单的例子:哈希方法在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
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的一些讨论: