2012-04-21 2 views
9

Eventuali duplicati:
Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?È garantito che False "è 0" e True "è 1"?

ho notato oggi che le seguenti opere utilizzando Python 2.6 (CPython) ...

>>> a=[100,200] 
>>> a[True] 
200 
>>> a[False] 
100 

È questo il portatile per altre implementazioni python (ad es. è True/False garantito per ereditare da int? È True g garantito di valutare a 1 invece di qualche altro numero diverso da zero?) C'è qualche situazione in cui ciò sarebbe utile? Sembra che potrebbe essere usato come un'altra forma di un operatore ternario, ma non so quanto si guadagna là ...

+6

(non è una risposta, ma potresti trovarlo interessante: in Python 2.6 e prima di Vero e Falso ci sono solo variabili quindi ... "Vero, Falso =" ciao "," mondo "' ... ma hanno * riservato * stato in Python 3.x) –

+0

Per quanto ne so, True e False sono etichette per 1 e 0. 1 == True e 0 == False. Pertanto, restituirebbe gli articoli 0 e 1 nell'elenco –

+0

@gwynhowell: no, 'True' e' False' sono oggetti a sé stanti, di tipo 'bool'. –

risposta

11

È part of the language specification, in modo che qualsiasi Python implementazione dovrebbe attuare le booleani come equivalente a i numeri interi

booleani

Questi rappresentano la verità falsi valori e vero. I due oggetti che rappresentano i valori False e True sono gli unici oggetti booleani. Il tipo booleano è un sottotipo di interi semplici ei valori booleani si comportano come i valori 0 e 1, rispettivamente, in quasi tutti i contesti, con l'eccezione che, quando vengono convertiti in una stringa, vengono restituite rispettivamente le stringhe "False" o "True".

4

Sì - questo è garantito - con l'avvertenza che True e False può essere riassegnata; ma ciò non influisce sui risultati delle operazioni booleane. (Grazie a Ignacio per la prova documentaria.) Infatti, quando non c'era un operatore ternario, questo era uno dei metodi usati per emularlo. Al giorno d'oggi, se si desidera un operatore ternario, utilizzare l'operatore ternario. Ma a volte questo costrutto è ancora utile. Ad esempio:

>>> even_odd = [[], []] 
>>> for i in range(10): 
...  even_odd[i % 2 == 1].append(i) 
... 
>>> print even_odd 
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] 

È possibile farlo anche con un dizionario. Ha un operatore ternario equivalente ...

>>> even, odd = [], [] 
>>> for i in range(10): 
...  (even if i % 2 == 1 else odd).append(i) 
... 
>>> even, odd 
([1, 3, 5, 7, 9], [0, 2, 4, 6, 8]) 

Ma in realtà ho trovato la versione lista-indicizzazione più facile da leggere, almeno in questo caso. YYMV.

+0

+1 per un ottimo esempio. – mgilson

+0

Non è più facile dire semplicemente 'even_odd [i% 2] .append (i)'? – thebjorn