在List comprehensions中的Python中的哈希函数

时间:2014-12-10 07:18:52

标签: python hash

我试图理解为什么代码的行为方式

class Baz():
    def __init__(self,name):
        self.name=name


k=[Baz(i) for i in range(4)]
print([hash(i) for i in k])

print([hash(Baz(i)) for i in range(4)])

此输出

[8736683315973, -9223363300171459831, 8736683315982, -9223363300171459822]

[8736683315991, 8736683315991, 8736683315991, 8736683315991]

我想知道为什么在第二种情况下我得到所有相同的哈希码

2 个答案:

答案 0 :(得分:4)

如果你没有在你的类中定义__hash__方法,Python将使用内存地址进行散列。

在第二种情况下,Bash(i)后不需要hash。 Python抛弃它并为下一个Bash实例重用内存,因此所有后续调用都获得相同的哈希值。

答案 1 :(得分:0)

class Baz():
    def __init__(self,name):
        self.name=name
        print self


>>> k=[Baz(i) for i in range(4)]       
    print k
[<__main__.Baz instance at 0x7f5a010290e0>, <__main__.Baz instance at 0x7f5a01029908>, <__main__.Baz instance at 0x7f5a01028758>, <__main__.Baz instance at 0x7f5a0102e050>]`

k携带实例列表传递给具有值Baz的班级0, 1, 2, 3

here `self` have different object for `i` in `[hash(i) for i in k]`
if you then

print([hash(i) for i in k])
<__main__.Baz instance at 0x7f2ae9a13290>
<__main__.Baz instance at 0x7f2ae9a30908>
<__main__.Baz instance at 0x7f2ae9a300e0>
<__main__.Baz instance at 0x7f2ae9a35050>
[8738892813097, -9223363297961955184, 8738892820494, 8738892821765]

print([hash(Baz(i)) for i in range(4)])

看到这里,实例传递给类Baz是一样的。因为hash使用相同的内存引用并抛出实例的先前内存引用。

<__main__.Baz instance at 0x7f2ae9a35290>
<__main__.Baz instance at 0x7f2ae9a35290>
<__main__.Baz instance at 0x7f2ae9a35290>
<__main__.Baz instance at 0x7f2ae9a35290>
[8738892821801, 8738892821801, 8738892821801, 8738892821801]