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 carry list of instances pass to class Baz with value 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)])
see here, instance pass to class Baz is same. because hash uses same memory references and throws the previous memory reference for the instances.
<__main__.Baz instance at 0x7f2ae9a35290>
<__main__.Baz instance at 0x7f2ae9a35290>
<__main__.Baz instance at 0x7f2ae9a35290>
<__main__.Baz instance at 0x7f2ae9a35290>
[8738892821801, 8738892821801, 8738892821801, 8738892821801]