2012-04-18 15 views

Respuesta

9
>>> a = [[]] 
>>> b = [] 
>>> b in a 
True 
>>> b is a[0] 
False 

Esto demuestra que se trata de una comprobación de valor (al menos de forma predeterminada), no una verificación de identidad. Tenga en cuenta, sin embargo, que una clase puede, si lo desea, anular __contains__() para que sea una verificación de identidad. Pero nuevamente, por defecto, no.

+0

¡Eso es perfecto gracias! –

1

Depende de la clase cómo se realiza el control. Para el built-in list, utiliza el operador ==; de lo contrario, no podría, por ejemplo, use 'something' in somelist de forma segura.

Para ser más específicos, comprueba si el elemento es igual a un elemento de la lista, por lo que internamente es más probable que sea una comparación hash(a) == hash(b); si los hash son iguales, probablemente también se comparen los objetos en sí.

+1

No será solo un control de hashes: los hashes pueden ser iguales sin que los valores sean iguales. –

+0

¡Gracias muchachos que es información muy útil! –

+0

Esto está mal. Acabo de definir un método '__eq__' que (' involuntariamente) ha recogido '__contains__' o' in'. Por lo tanto, lo más probable es que 'list' implemente una comparación' a .__ eq __ (b) '. – Atcold