Curiosidad sobre __hash__()

David García daganu en gmail.com
Jue Feb 5 15:15:01 CET 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Francesc Alted escribió:
> A Thursday 05 February 2009, David García escrigué:
>>> Uh, creo que no:
>>>
>>> In [6]: a = (2,)
>>>
>>> In [7]: id(a)
>>> Out[7]: 136302508
>>>
>>> In [8]: hash(a)
>>> Out[8]: -1658481943
>>>
>>> o sea, que el hash no devuelve la posición de memoria y se trata de
>>> un verdadero hash.  Aquí hay un ejemplo de como se calculan los
>>> hashes para algunos objetos:
>> Es id() la que devuelve la dirección de memoria.
> 
> Si, es lo que queria decir.
> 
>>> http://effbot.org/zone/python-hash.htm
>> Tampoco __hash__() es muy fiable como "hash":
>>>>> a = (2,)
>>>>> b = (2,)
>>>>> a.__hash__()
>> -1658481943
>>
>>>>> b.__hash__()
>> -1658481943
>>
>> ...
>>
>>>>> id(a)
>> 3084404620L
>>
>>>>> id(b)
>> 3084316012L
> 
> A ver, si a y b *son* el mismo objeto ((2,), que no necesariamente es la 
> misma dirección de memoria), la hash ha de ser la misma, no?
> 

No se trata del mismo objeto, además de diferentes direcciones de memoria
en caso de ser mutables (una lista) si "a" cambia, "b" no lo hace (Como
curiosidad las listas no tienen hash, solo sus elementos, si no son listas, y en
caso de que la tupla solo contenga listas __hash__ falla)

Tienen el mismo hash porque las tuplas para calcularlo usan el hash de sus
miembros, y en este caso son el mismo id(a[0]) == id(b[0]).

Imagino que al ser 2 un elemento con valor constante Python usa su dirección
tantas veces como 2 sea referenciado.


















-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkmK9GIACgkQpOHtvLfXu8DMowCfY9z4rubjSKluQdCE60EEbBN7
HYkAoJSsjMRnVUjkbxhTJ6l3T0wsNA8j
=FQoJ
-----END PGP SIGNATURE-----
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es