我试图理解为什么代码的行为方式
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]
我想知道为什么在第二种情况下我得到所有相同的哈希码
答案 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]