2012-05-02 13 views
9

No puedo agregar el número entero 1 a un conjunto existente. En un shell interactivo, esto es lo que estoy haciendo:Agregar el número 1 a un conjunto no tiene efecto

>>> st = {'a', True, 'Vanilla'} 
>>> st 
{'a', True, 'Vanilla'} 
>>> st.add(1) 
>>> st 
{'a', True, 'Vanilla'} # Here's the problem; there's no 1, but anything else works 
>>> st.add(2) 
>>> st 
{'a', True, 'Vanilla', 2} 

Esta pregunta fue publicada hace dos meses, pero creo que fue malinterpretado. Estoy usando Python 3.2.3.

+5

¿Por qué tratar de almacenar valores de verdad, cadenas y números en un solo juego? ¿Qué problema estabas tratando de resolver? –

Respuesta

13
>>> 1 == True 
True 

Creo que su problema es que 1 y True son del mismo valor, por lo que 1 es "ya está en el conjunto".

>>> st 
{'a', True, 'Vanilla'} 
>>> 1 in st 
True 

En operaciones matemáticas True está a su vez tratados como 1:

>>> 5 + True 
6 
>>> True * 2 
2 
>>> 3./(True + True) 
1.5 

Aunque verdadero es un bool y 1 es un int:

>>> type(True) 
<class 'bool'> 
>>> type(1) 
<class 'int'> 

Debido 1 in st devuelve verdadero, creo que se no debería tener ningún problema con eso. Sin embargo, es un resultado muy extraño. Si está interesado en seguir leyendo, @Lattyware apunta al PEP 285, lo que explica este problema en profundidad.

+1

Interesante que '1' y' True' se consideran iguales cuando su representación es totalmente diferente. –

+1

@MarkRansom Estoy de acuerdo, casi lo llamaría un error? Me encantaría escuchar la explicación de Guido de por qué sucede esto. –

+0

Supongo que no es diferente de '1 == 1.0'. Sin embargo, parece bastante extraño. –

3

Creo, aunque no estoy seguro, porque hash(1) == hash(True) y también que se consideran los mismos elementos por el set. No creo que ese sea el caso, ya que 1 is True es False, pero creo que explica por qué no puedes agregarlo.

+0

El resultado 'is' es un detalle de implementación y nunca se debe confiar en él. '==' es la prueba correcta. –

+0

+1 porque la equivalencia hash es la clave aquí, pero estoy de acuerdo con Mark en que lo que dijiste sobre 'is' no es realmente relevante. '1 is 1' podría ser' False' y no violar nada en la documentación (y algo como '300 is (299 + 1)' probablemente le dará 'False'). –

1

1 es equivalente a True como 1 == True devuelve verdadero. Como resultado, la inserción de 1 se rechaza porque un conjunto no puede tener duplicados.

Cuestiones relacionadas