2012-05-02 10 views
9

Non è possibile aggiungere il numero intero 1 a un set esistente. In una shell interattiva, questo è quello che sto facendo:L'aggiunta del numero 1 a un set non ha alcun effetto

>>> 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} 

Questa domanda è stato pubblicato due mesi fa, ma credo che è stato frainteso. Sto usando Python 3.2.3.

+5

Perché si tenta di memorizzare valori di verità, stringhe e numeri in un unico insieme? Che problema stavi cercando di risolvere? –

risposta

13
>>> 1 == True 
True 

Credo che il vostro problema è che 1 e True hanno lo stesso valore, in modo da 1 è "già nel set".

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

Nelle operazioni matematiche True è a sua volta trattato come 1:

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

E 'vero è un bool e 1 è un int:

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

perché 1 in st restituisce True, penso che tu non dovrebbe avere problemi con esso. È un risultato molto strano però. Se sei interessato a ulteriori letture, @Lattyware punta a PEP 285 che spiega in modo approfondito questo problema.

+1

Interessante che '1' e' True' sono considerati uguali quando la loro rappresentazione è completamente diversa. –

+1

@MarkRansom Sono d'accordo, vorrei quasi definirlo un difetto? Mi piacerebbe sentire la spiegazione di Guido del perché questo accada. –

+0

Suppongo che non sia diverso da '1 == 1.0'. Di certo sembra strano. –

3

Credo, anche se non ne sono sicuro, perché hash(1) == hash(True) e anche 1 == True che sono considerati gli stessi elementi dal set. Non credo che dovrebbe essere il caso, come 1 is True è False, ma credo che spiega perché non è possibile aggiungerlo.

+0

Il risultato 'is' è un dettaglio di implementazione e non dovrebbe mai essere invocato. '==' è il test corretto. –

+0

+1 perché l'equivalenza dell'hash è la chiave qui, ma sono d'accordo con Mark che ciò che hai detto su 'is' non è molto rilevante. '1 is 1' potrebbe essere' False' e ​​non violare nulla nella documentazione (e qualcosa come '300 is (299 + 1)' probabilmente ti darà 'False'). –

1

1 equivale a True come 1 == True restituisce true. Di conseguenza l'inserimento di 1 viene rifiutato poiché un set non può avere duplicati.

Problemi correlati